У меня есть приложение Spark, которое должно будет сильно использовать unions
, в результате чего я буду объединять множество DataFrames вместе в разное время, в разных обстоятельствах. Я пытаюсь сделать это так эффективно, насколько смогу. Я до сих пор в значительной степени бренд-шлепки новый Спарк, и что-то мне пришло в голову:Управление разделами Spark после соединений DataFrame
Если у меня есть DataFrame «A» (dfA
), который имеет X количество разделов (numAPartitions
), и я союз, который в DataFrame «B» (dfB
), у которого есть Y-число перегородок (numBPartitions
), что будет выглядеть в результате объединенного DataFrame (unionedDF
) с результатом для разделов?
// How many partitions will unionedDF have?
// X * Y ?
// Something else?
val unionedDF : DataFrame = dfA.unionAll(dfB)
Для меня это кажется его очень важно понять, видя, что производительность Спарк кажется в значительной степени зависят от стратегии разделения, используемой DataFrames. Поэтому, если я объединяю DataFrames влево и вправо, мне нужно убедиться, что я постоянно управляю разделами полученных объединенных DataFrames.
только вещь, которую я могу думать (так, чтобы правильно управлять разделов unioned DataFrames) было бы перераспределить их, а затем последовательно сохраняются в DataFrames к памяти/диск как только союз им:
val unionedDF : DataFrame = dfA.unionAll(dfB)
unionedDF.repartition(optimalNumberOfPartitions).persist(StorageLevel.MEMORY_AND_DISK)
Таким образом, как только они объединены, мы перепечатываем их, чтобы правильно распределить их по доступным рабочим/исполнителям, а затем вызов persist(...)
говорит Спарку не вытеснять DataFrame из памяти, поэтому мы можем продолжать работать в теме.
Проблема заключается в том, переразметке звучит дорого, но это может не быть столь же дорого, как альтернатива (не управление разделами на всех). Существуют ли общепринятые рекомендации о том, как эффективно управлять профсоюзами в Искра-земле?
Благодаря @gsamaras (+1) - Я на самом деле не спрашиваю, как узнать, сколько перегородки моих DataFrames есть, что я действительно спрашиваю, есть ли у меня к перераспределение и упорство, чтобы управлять ими, после профсоюзов. Есть предположения? – smeeb
@smeeb Я обновил свой ответ с некоторыми мыслями, так как у вас не было другого ответа. Надеюсь, что это поможет! :) – gsamaras
Еще раз спасибо @gsamaras (+1) - два быстрых вопроса о последующих действиях, если вы не возражаете: ** (1) ** Когда вы говорите: «* Это предотвратит искру, снова извлекая его из памяти и может увеличить производительность вашего приложения ... * ", я думаю, я не понимаю, что вы подразумеваете под" * ... предотвращать искру от извлечения ** в памяти ** снова ... * ". Разве DataFrame * всегда * в памяти? И если Spark извлекает DataFrame * из * памяти, где еще можно было бы загрузить DataFrame? Разве память не является самым быстрым местом для хранения DataFrame?!? – smeeb