1

У меня есть приложение 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 из памяти, поэтому мы можем продолжать работать в теме.

Проблема заключается в том, переразметке звучит дорого, но это может не быть столь же дорого, как альтернатива (не управление разделами на всех). Существуют ли общепринятые рекомендации о том, как эффективно управлять профсоюзами в Искра-земле?

ответ

1

Да, перегородки важны для .

Я задаюсь фи вы можете обнаружить, что из себя по телефону:

yourResultedRDD.getNumPartitions() 

ли я упорствовать, после объединения?

В общем, вам необходимо удержать/кешировать RDD (независимо от того, является ли это результатом объединения или картофеля :)), если вы собираетесь использовать его несколько раз. Это позволит предотвратить получение в памяти и может увеличить производительность вашего приложения на 15%, в некоторых случаях!

Например, если вы собираетесь использовать приведенное RDD только один раз, было бы безопасно не продолжать его.

Должен ли я переделать?

Поскольку вы не заботитесь о поиске количества разделов, вы можете прочитать в своем memoryOverhead issue in Spark о том, как количество разделов влияет на ваше приложение.

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

Напомним, что работник может размещать несколько исполнителей, вы можете думать о нем как о том, что рабочий является машиной/узлом вашего кластера, а исполнителем является процесс (выполняющийся в ядре), который выполняется на этом рабочем месте.

Не всегда ли DataFrame в памяти?

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

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

Для более чтений: Should I always cache my RDD's and DataFrames?

+0

Благодаря @gsamaras (+1) - Я на самом деле не спрашиваю, как узнать, сколько перегородки моих DataFrames есть, что я действительно спрашиваю, есть ли у меня к перераспределение и упорство, чтобы управлять ими, после профсоюзов. Есть предположения? – smeeb

+1

@smeeb Я обновил свой ответ с некоторыми мыслями, так как у вас не было другого ответа. Надеюсь, что это поможет! :) – gsamaras

+0

Еще раз спасибо @gsamaras (+1) - два быстрых вопроса о последующих действиях, если вы не возражаете: ** (1) ** Когда вы говорите: «* Это предотвратит искру, снова извлекая его из памяти и может увеличить производительность вашего приложения ... * ", я думаю, я не понимаю, что вы подразумеваете под" * ... предотвращать искру от извлечения ** в памяти ** снова ... * ". Разве DataFrame * всегда * в памяти? И если Spark извлекает DataFrame * из * памяти, где еще можно было бы загрузить DataFrame? Разве память не является самым быстрым местом для хранения DataFrame?!? – smeeb