2016-11-28 2 views
0

Я пишу код в pyspark, где я делаю фильтрацию, объединение, unionall, groupby.Оптимизация в pyspark

Но я заметил, что перед групповым отключением функция count() занимает 9 минут, а после groupby функция count() занимает 35 минут. Мне нужно несколько советов о том, как оптимизировать предложение groupby, чтобы сократить время обработки.

Параметры конфигурации: исполнитель памяти 12G Num-исполнителей 50 исполнитель сердечники памяти 5 Драйвер 40g размер данных около 1 ТБ

Фрагмент кода, например:

dataframeA = hc.sql("select * from tableA") 



dataframeB = hc.sql("select * from tableB") 

dataframeC = hc.sql("select * from tableC") 



dataframeD = dataframeA.unionAll(dataframeB) 



dataframeE = dataframeD.join(dataframeC, col1 == col2, 'left_outer') 



dataframeF = dataframeE.groupby ([col1, col2] 
        .agg({ 
         max("col3"), 
         sum("col4")/ sum("col5"), 
         ... 
         }) 

предложения?

+0

, чтобы быть в состоянии помочь вам отправить ваш код (или, по крайней мере, упростить его) –

+0

Добавлен фрагмент кода для справки. – Renu

ответ

0

Вы можете использовать reduceByKey вместо groupByKey.

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

+0

Да, я подозреваю то же самое, что в группе происходит чрезмерное перетасовка. Но можно ли применить reducebykey здесь в моем случае, когда я использую все dataframes, и есть 100 столбцов в агрегации? – Renu

+0

В вашем случае оптимизирован 'groupBy' DataFrame, поэтому я не думаю, что' reduceByKey' действительно работает. –

+0

Есть ли способ уменьшить перетасовку в группе и операцию агрегации? – Renu

0

Сама логика выглядит нормально. Есть несколько вещей, которые вы можете попробовать:

У вас есть соединение и группа, которые обычно предлагают немного перетасовки. Вы можете попытаться уменьшить количество исполнителей, предоставляя больше памяти и ядра.

В вашей группе вы используете клавишу [col1, col2]. Являются ли эти те же столбцы, что и в соединении? Если это так, то они по сути являются одним и тем же столбцом с разницей, когда на левом фрейме нет ключа. Поэтому вы можете использовать только col2, и, надеюсь, оптимизатор улучшит ваш второй случайный выбор (используйте оригинальную перетасовку).

+0

В моем случае есть 3 соединения, и один из них имеет тот же ключ, что и у группы. Сокращение числа исполнителей не работает в этом случае, когда он принимает одинаковое время выполнения. – Renu

+0

Что я заметил из веб-интерфейса, последние 4 этапа из 23 занимают более половины времени. Как насчет увеличения разделов? – Renu

+0

Увеличение количества разделов, как правило, поможет, если у вас есть ядра для их обработки. Это в основном увеличивает параллелизм ... –