Читать «Распределенные системы. Паттерны проектирования» онлайн - страница 93
Б Бёрнс
Суммирование
Суммирование некоторого множества значений — похожая, но немного другая разновидность свертки. Она подобна подсчету, но каждый раз к аккумулятору прибавляется не единица, а зна-чение элемента данных.
К примеру, вы хотите посчитать численность населения Со-единенных Штатов. Предположим, для этого вы сначала опре-Глава 12. Координированная пакетная обработка 211 делите численность населения в каждом городе, а затем про-суммируете полученные результаты.
Первый шаг — разделить задачу на очереди по городам с шар-дированием по штатам. Это хороший первый шаг, но очевидно, что даже при параллельном распределении задачи одному чело-веку будет трудно подсчитать численность населения в каждом городе. Следовательно, необходимо углубить шардирование, на этот раз по округам.
На данный момент мы распараллелили задачу по штатам, затем по округам. Очереди задач в каждом округе на выходе выдают поток пар вида (город , население) .
Как только на выходе появляются значения, начинает работу паттерн Reduce.
В данном случае ему даже не обязательно знать о двухуров-невом шардировании. Ему достаточно взять два выходных элемента, например (Сиэтл, 4000000) и (Нортгемптон , 25000) и просуммировать их. В результате получится новый выход-
ной элемент (Сиэтл-Нортгемптон, 4025000) . Очевидно, что, как и в случае с подсчетом, такая свертка может выполняться неограниченное количество раз, в результате чего получится единственное выходное значение, содержащее общую числен-ность населения США. Опять-таки важно то, что почти все не-обходимые вычисления происходят параллельно. Гистограмма
В качестве последнего примера применения паттерна Reduce рассмотрим задачу, в которой одновременно с определением численности населения США путем шардирования и свертки нужно построить модель среднестатистической американской семьи. Для этого желательно получить гистограмму размера 212 Часть III. Паттерны проектирования систем пакетных вычислений семьи, то есть модель, оценивающую общее количество семей с количеством детей от 0 до 10. Многоуровневое шардирование организуется так же, как и прежде (вероятно, даже с использо-ванием тех же исполнителей).
Выходным значением фазы сбора данных в этом случае будет гистограмма по городу:
0: 15%
1: 25%
2: 50%
3: 10%
4: 5%
Из предыдущих примеров видно, что можно объединить все эти гистограммы в одну, получив тем самым общую картину по США. Сперва может быть довольно трудно понять, как выполнить слияние гистограмм. Взяв данные гистограммы и данные о населении из предыдущего примера, видим, что если умножить данные гистограмм на соответствующую чис-ленность жителей, то можем получить количество населения для каждого элемента данных объединенной гистограммы. По-делив эти значения на сумму численностей населения, соответ-ствующих объединяемым гистограммам, получим данные для объединенной гистограммы. Таким образом, можно применять паттерн Reduce столько раз, сколько нужно, пока не получится единственная гистограмма.