Я использую Spark на EMR. Я запускаю кластер и иногда кластер небольшой (при написании / тестировании кода), скажем, 5-10 экземпляров. В других случаях выполнение того же кода с использованием большего количества экземпляров, скажем, 30-50.
Я знаю, что могу получить доступ к конфигурациям, чтобы помочь в установке количества разделов, и выбор хорошего количества разделов помогает среде выполнения.
Я хотел бы параметризовать количество разделов в зависимости от количества исполнителей и количества потоков:
val instanceCount = sc.getConf.get("spark.executor.instances").toDouble
val coreCount = sc.getConf.get("spark.executor.cores").toDouble
Кто-нибудь изучал это и может дать какие-либо советы о хорошем способе параметризации количества разделов?
Я понимаю, что не будет одного хорошего ответа, но какая-то функциональная форма с константами поможет. Например:
val partitionCount = instanceCount*coreCount*0.7
похоже, хорошо работает в моих случаях использования и опишите ваши варианты использования (количество / диапазон исполнителей), которые были бы полезны.
Если бы вы могли указать в ответе, над какими примерами вы работаете, это тоже будет полезно. Если где-то есть каноническое расследование этого вопроса, было бы полезно указать на это.
@RaphaelRoth, когда вы говорите «Если у вас много ядер (скажем, более 100)», вы имеете в виду общее количество ядер во всех исполнителях или количество ядер в каждом исполнителе? Я понимаю, что могу изменить файл конфигурации, но для моих экспериментов я бы предпочел динамически распределять конфигурацию с настройкой кластера.
важно общее количество ядер. Процитируем blog.cloudera.com/blog/2015/03/…: «Основная проблема заключается в том, что количество задач будет слишком маленьким. Если задач меньше, чем доступных слотов для их выполнения, этап не будет использовать весь доступный процессор».
@ Рафаэль Рот, хотя я согласен, что вы не хотите, чтобы количество ядер было слишком маленьким, по моему опыту, если вы сделаете его слишком большим, машины будут использовать слишком много ресурсов и не излучают сердцебиение и в конечном итоге считаются мертвыми. монитор сердцебиения. По крайней мере, это моя гипотеза о том, почему мои узлы помечены как мертвые, но все еще здоровы. Это мотивирует меня беспокоиться о создании слишком большого количества разделов.
@LucasRoberts, мой ответ немного отличается от того, как вы задали вопрос, но, по сути, я думаю, что он говорит о том, что количество разделов не является функцией количества экземпляров и ядер на экземпляр, и наоборот. В игру вступает множество вещей, и хотя эти параметры имеют некоторые взаимные зависимости, вы не можете просто выразить одно через другое во всех случаях. Надеюсь, что длинный ответ, который я оставил, вам поможет, дайте мне знать, могу ли я его улучшить





количество разделов должно быть кратным (скажем, 2-4)
instanceCount*coreCount. Если у вас меньше разделов, чем общее количество ядер, некоторые ядра будут простаивать. Если у вас много ядер (скажем, более 100), вам также следует увеличитьspark.sql.shuffle.partitions(по умолчанию 200).