Поток данных GroupByKey и CoGroupByKey очень медленный - PullRequest
0 голосов
/ 07 сентября 2018

Поток данных отлично работает для конвейеров с простыми преобразованиями, но когда у нас есть сложные преобразования, такие как объединения, производительность действительно плохая.

1 Ответ

0 голосов
/ 07 сентября 2018

Я написал этот вопрос, чтобы ответить на него сам.

Что происходит под капотом:

  • Данные, отправленные с помощью потока данных между PCollections (сериализуемые объекты), могут не существовать на одном компьютере. Кроме того, для преобразования, подобного GroupByKey / CoGroupByKey, требуется, чтобы все данные были собраны в одном месте до заполнения результирующего значения.
  • Недавно я работал над огромным набором данных с 970 столбцами информации. Теперь эти данные огромны (PCollecction около 300 ГБ). В моем сценарии использования мне пришлось объединить эту информацию с другой PCollection (PCollecction с 5 столбцами) с CoGroupByKey, и когда данные были переданы как есть, для их подготовки потребовались часы он может даже выполнить операцию группировки.

1012 * Обход *

  • Уменьшите размер строки, чтобы у вас была только необходимая информация для присоединения к коллекции

Например, если у вас есть 1 ключевой столбец в левой коллекции и вам нужен 1 столбец значений из правой коллекции, передайте только эту информацию в преобразования CoGroupByKey. Хотя это приведет к потере данных вашей исходной коллекции, вы создадите поисковую коллекцию, в которой содержится информация о том, что вам нужно на основе KV.

Затем вы можете использовать DoFn для обхода ваших данных, восстановления ключа и извлечения данных из данных с карты, переданной в качестве бокового ввода.

Этот подход дает потрясающие результаты, и это позволило мне объединить данные, упомянутые выше, в течение 5 минут.

...