Проверяет понимание механизмов агрегации данных при параллельной обработке воркерами в распределённых системах.
Когда данные обрабатываются параллельно несколькими воркерами, каждый из них получает свою порцию входных данных и вычисляет промежуточные результаты. Чтобы получить единый итоговый ответ, эти результаты необходимо объединить. Этот процесс называется агрегацией и обычно реализуется по модели MapReduce: сначала фаза map (обработка), затем фаза shuffle (перераспределение по ключам), и наконец фаза reduce (объединение).
Представьте, что нужно посчитать сумму продаж по регионам. Каждый воркер обрабатывает свой набор записей и выдаёт пары (регион, сумма). На этапе shuffle все пары с одинаковым регионом отправляются одному редуктору. Редуктор складывает все суммы для своего региона и выдаёт итог. Такой подход позволяет обрабатывать терабайты данных, распределяя нагрузку между машинами.
// Пример на JavaScript (упрощённо)
const data = [
{ region: 'Moscow', amount: 100 },
{ region: 'SPb', amount: 200 },
{ region: 'Moscow', amount: 150 }
];
// Фаза map: группировка по ключу
const mapped = data.map(item => [item.region, item.amount]);
// Фаза shuffle: сортировка и группировка
const grouped = {};
mapped.forEach(([key, value]) => {
if (!grouped[key]) grouped[key] = [];
grouped[key].push(value);
});
// Фаза reduce: суммирование
const result = {};
Object.keys(grouped).forEach(key => {
result[key] = grouped[key].reduce((sum, v) => sum + v, 0);
});
console.log(result); // { Moscow: 250, SPb: 200 }Агрегация после параллельной обработки используется в системах больших данных (Hadoop, Spark), в базах данных с шардированием, в потоковой обработке (Kafka Streams, Flink). Также этот паттерн встречается в веб-приложениях при использовании Web Workers для параллельных вычислений.
Понимание агрегации критично для проектирования масштабируемых систем. Если вы работаете с большими объёмами данных или распределёнными вычислениями, обязательно учитывайте этапы shuffle и reduce, чтобы корректно объединять результаты воркеров.