Почему в Scio вы предпочитаете агрегат, а не groupByKey?

От:

https://github.com/spotify/scio/wiki/Scio-data-guideline

«Предпочитайте преобразования объединения/агрегирования/уменьшения, а не groupByKey. Имейте в виду, что операция сокращения должна быть ассоциативной и коммутативной».

Почему, в частности, предпочтительнее агрегат, чем groupByKey?


person Andrew Cassidy    schedule 11.05.2018    source источник


Ответы (1)


Преобразования комбинирования, агрегирования и сокращения предпочтительнее, чем groupByKey, поскольку первые более эффективно используют память во время выполнения конвейера. Это связано с реализацией примитивных преобразований GroupByKey и Combine в Apache Beam. Ответ на этот вопрос не обязательно специфичен для Scio.

GroupByKey требует, чтобы все пары ключ-значение оставались в памяти, что может привести к OutOfMemoryErrors. Все пары ключ-значение остаются в памяти для каждого окна. groupByKey использует примитивное преобразование Beam GroupByKey.

Агрегации устраняют необходимость хранить все значения в памяти, поскольку во время выполнения преобразования значения постоянно комбинируются/сокращаются. Значения объединяются/уменьшаются в недетерминированном порядке, поэтому все операции объединения/уменьшения должны быть ассоциативными. Реализация Scio aggregateByKey использует примитивное преобразование Beam Combine.

Ссылки:
1. Scio groupByKey
2. Scio aggregateByKey
3. Apache Beam GroupByKey
4. Apache Beam Объединить
5. Облачный поток данных Google Объединить

person Andrew Nguonly    schedule 12.05.2018
comment
Я также рекомендую проверить ответ Даниэля по адресу stackoverflow.com/questions/6928374/ - person Andrew Cassidy; 14.05.2018
comment
Я предполагаю, что я все еще не понимаю, как вы используете агрегат по ключу без предварительного создания PairSCollectionFunctions, для которого требуется groupByKey? ДОУ... Я только что понял. Вы назначаете ключ исходному SCollection. - person Andrew Cassidy; 14.05.2018
comment
Я не знаю о Scio в частности, но Beam в целом может обрабатывать GroupByKey, где не все пары ключ-значение помещаются в память. Агрегация по-прежнему предпочтительна, поскольку она позволяет разгрузить часть сокращения на преобразователи перед группировкой (как распределяя нагрузку на ЦП, так и уменьшая количество перетасовываемых данных). - person robertwb; 21.02.2019