После размытия номерных знаков на всех изображениях ре-зультат загрузим в другое место, а исходные изображения уда-лим. Оригиналы не следует удалять до тех пор, пока не будут обработаны все изображения. Они понадобятся на случай ка-тастрофического сбоя, если придется заново перезапустить процесс обработки. Для того чтобы дождаться обработки всех изображений, воспользуемся паттерном Join, рассмотренным в предыдущей главе. С его помощью мы объединим шардиро-ванные очереди задач в одну общую очередь, которая освободит 214Часть III. Паттерны проектирования систем пакетных вычислений
Рис. 12.3. Шардированная очередь с несколькими шардами для размытияизображения
элементы для дальнейшей обработки только после того, как все шарды завершат работу.
Теперь можно удалить оригиналы и начать распознавание ма-рок и цветов машин. Пропускную способность данного кон-вейера также хотелось бы максимизировать, поэтому восполь-зуемся паттерном Copier из предыдущей главы и создадим две отдельные очереди:
очередь задач по удалению оригиналов; очередь задач по определению цвета и марки машины. На рис. 12.4 схематически изображены упомянутые стадии об-работки.
Глава 12. Координированная пакетная обработка 215
Рис. 12.4. Этапы слияния и копирования очередей, удаления исходныхизображений и распознавания образов
Наконец, необходимо разработать очередь задач по распознава-нию автомобиля и его цвета, которая бы подводила статистику по данным параметрам. Для этого сначала применим шарди-рование, чтобы распределить работу на несколько очередей. В каждой из очередей будет два исполнителя: один будет рас-познавать положение и тип транспортного средства, а второй — определять цвет распознанной области. Для слияния снова воспользуемся паттерном Multi-Worker, рассмотренным в гла-ве 10. Как и ранее, разделение кода на несколько контейнеров 216Часть III. Паттерны проектирования систем пакетных вычислений позволяет использовать контейнер, определяющий цвет, в дру-гих системах для определения цветов других объектов, а не только автомобилей.
Выходные данные очереди в формате JSON будут выглядеть примерно следующим образом:
{
"ТС": {
"автомобиль": 12,
"грузовик": 7,
"мотоцикл": 4
},
"цвета": {
"белый": 8,
"черный": 3,
"синий": 6,
"красный": 6
}
}
В этих данных представлена информация, найденная в одном изображении. Чтобы собрать данные воедино, воспользуемся описанным ранее паттерном Reduce, ставшим популярным бла-годаря MapReduce. Просуммируем все элементы точно так же, как и в примере с подсчетом. Стадия свертки в качестве резуль-тата выдает итоговое количество образов и цветов, найденных во всем множестве снимков.
Читать дальше