Является ли groupByKey когда-либо предпочтительным по сравнению с ReduByKey

Я всегда использую reduceByKey, когда мне нужно сгруппировать данные в RDD, потому что он выполняет уменьшение на стороне карты перед перетасовкой данных, что часто означает, что меньше данных перетасовывается и, таким образом, я получаю лучшую производительность. Даже когда функция на стороне карты собирает все значения и фактически не уменьшает объем данных, я все равно использую reduceByKey, потому что я предполагаю что производительность reduceByKey никогда не будет хуже, чем groupByKey

12 голосов | спросил Glennie Helles Sindholt 19 +03002015-10-19T21:49:05+03:00312015bEurope/MoscowMon, 19 Oct 2015 21:49:05 +0300 2015, 21:49:05

2 ответа


0

reduceByKey и groupByKey оба используют combineByKey с различной семантикой объединения /слияния.

Ключевое различие, которое я вижу, заключается в том, что groupByKey передает флаг (mapSideCombine=false) к шаффл движку. Судя по проблеме SPARK-772 , это подсказка движку тасования, чтобы не запускать объединитель карт на стороне когда размер данных не собирается меняться.

Поэтому я бы сказал, что если вы пытаетесь использовать reduceByKey для репликации groupByKey, вы можете увидеть небольшое снижение производительности.

ответил Mike Park 19 +03002015-10-19T22:31:55+03:00312015bEurope/MoscowMon, 19 Oct 2015 22:31:55 +0300 2015, 22:31:55
0

Я не буду изобретать колесо, согласно документации кода, операция groupByKey группирует значения для каждого ключа в СДР в одну последовательность, которая также позволяет управлять разделением полученной пары ключ-значение RDD, передавая Partitioner.

Эта операция может быть очень дорогой. Если вы группируете для выполнения агрегации (например, суммы или среднего) по каждому ключу, используйте aggregateByKey или reduceByKey обеспечит гораздо лучшую производительность.

Примечание. В настоящее время реализовано, что groupByKey должно содержать все пары ключ-значение для любого ключа в памяти. Если ключ имеет слишком много значений, это может привести к OOME.

На самом деле, я предпочитаю операцию combineByKey, но иногда сложно понять концепцию объединителя и слияния если вы не очень знакомы с парадигмой сокращения карты. Для этого вы можете прочитать здесь Библию Yahoo! эта тема.

Для получения дополнительной информации советую прочитать Код PairRDDFunctions .

ответил eliasah 19 +03002015-10-19T22:01:13+03:00312015bEurope/MoscowMon, 19 Oct 2015 22:01:13 +0300 2015, 22:01:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132