Оптимизируйте Partitionning для миллиардов различных ключей - PullRequest
0 голосов
/ 10 мая 2019

Я обрабатываю файл каждый день с PySpark для сбора информации о навигации устройства через Интернет. В конце каждого месяца я хочу использовать оконные функции для навигации по каждому устройству. Это очень медленная обработка, даже со многими узлами, поэтому я ищу способы ускорить ее.

Моя идея состояла в том, чтобы разделить данные, но у меня есть 2 миллиарда различных ключей, поэтому partitionBy не кажется подходящим. Даже bucketBy не может быть хорошим выбором, потому что я создаю n сегментов каждый день, поэтому файлы не добавляются, но на каждый день создается x частей файлов.

У кого-нибудь есть решение?

Итак, вот пример экспорта для каждого дня (внутри каждого файла паркета мы находим 9 разделов):

enter image description here

А вот запрос partitionBy, который мы запускаем в начале каждого месяца (compute_visit_number и compute_session_number - это два udf, которые я создал на блокноте): enter image description here

1 Ответ

0 голосов
/ 09 июня 2019

Вы хотите, чтобы данные каждого устройства находились в одном и том же разделе, чтобы предотвратить обмен при выполнении вашей оконной функции.Или, по крайней мере, минимизируйте количество разделов, в которых могут находиться данные.

Чтобы сделать это, я бы создал столбец partitionKey, когда вы записываете данные - которые содержат мод в столбце mc_device - где номер, который вы модифицировалиby - количество разделов, которое вы хотите.На основе этого числа укажите размер кластера, который будет выполнять запрос на конец месяца.(Если mc_device не является целым числом, сначала создайте контрольную сумму).

Вы можете создать вторичный раздел в столбце даты, если это все еще необходимо.

Ваш запрос на конец месяца должен измениться:

w = Windows.partitionBy('partitionKey', 'mc_device').orderBy(event_time')

Если вы сохранили дату в качестве столбца вторичного раздела, то перераспределите кадр данных только для partitionKey:

df = df.repartition('partitionKey')

На этом этапе данные каждого устройства будут находиться в одном разделе, и обмены не должныбыть нужным.Сортировка должна быть быстрее, и ваш запрос, как мы надеемся, будет завершен в разумные сроки.

Если он все еще медленный, вам понадобится больше разделов при записи данных.

...