Я читал много вопросов на эту тему в SO, и я сделал скромный bash-скрипт для быстрого получения этих значений.
Основными источниками для создания скрипта были:
Сценарий содержит следующее:
# fixed values
CORES_PER_EXECUTOR=5 # (for good HDFS throughput) --executor-cores
HADOOP_DAEMONS_CORE=1
HADOOP_DAEMONS_RAM=1
# Example values
# This information can be obtained using the `lscpu` command
total_nodes_in_cluster=10 # `CPU(s):` field of lscpu
total_cores_per_node=16 # `Core(s) per socket:` field of lscpu
total_ram_per_node=64 # using `free -h` command
available_cores_per_node=$((total_cores_per_node - HADOOP_DAEMONS_CORE))
available_cores_in_cluster=$((available_cores_per_node * total_nodes_in_cluster))
available_executors=$((available_cores_in_cluster / CORES_PER_EXECUTOR))
num_of_executors=$((available_executors - 1 )) # Leaving 1 executor for ApplicationManager
num_of_executors_per_node=$((available_executors / total_nodes_in_cluster))
mem_per_executor=$((total_ram_per_node / num_of_executors_per_node))
# Counting off heap overhead = 7% of `mem_per_executor`GB:
# TODO "Counting off heap overhead = 7% of 21GB = 3GB. ???
seven_percent=$((mem_per_executor / 7))
executor_memory=$((mem_per_executor - seven_percent))
echo -e "The command will contains:\n spark-submit --class <CLASS_NAME> --num-executors ${num_of_executors} --executor-cores ${CORES_PER_EXECUTOR} --executor-memory ${executor_memory}G ...."
Я хотел бы знать:
- Может ли кто-нибудь помочь мне разобраться в части "Отсчет кучи = 7%
mem_per_executor
ГБ:"? Я имею в виду, я сделал математику, но я не понимаю идею позади.
- Если сценарий правильный и значения были взяты для реального кластера, почему задание Spark было похоже на «зависание», если я хорошо выполнял то же задание, но без каких-либо из этих параметров?
- Есть идеи добавить этот скрипт и получить больше параметров для отправки на
spark-submit
?
Спасибо!