SPARK 2.4 Standalone + несколько рабочих на одном многоядерном сервере; Материалы ждут ресурсов
На разумно оборудованном 64-битном (домашнем) сервере Fedora 12-Cores
а также 64gb-RAM
, Я имею Spark 2.4
работает в Standalone
режим со следующей конфигурацией в ./spark-env.sh
(где не показаны элементы в этом файле, которые я оставил закомментированными):
# =====================================================================
# Options for the daemons used in the standalone deploy mode
# =====================================================================
export SPARK_MASTER_HOST=dstorm
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8080 # JupyterLab uses port 8888.
# ---------------------------------------------------------------------
export SPARK_WORKER_CORES=3 # 12 # To Set number of worker cores to use on this machine.
export SPARK_WORKER_MEMORY=4g # Total RAM workers have to give executors (e.g. 2g)
export SPARK_WORKER_WEBUI_PORT=8081 # Default: 8081
export SPARK_WORKER_INSTANCES=4 # 5 # Number of workers on this server.
# ---------------------------------------------------------------------
export SPARK_DAEMON_MEMORY=1g # To allocate to MASTER, WORKER and HISTORY daemons themselves (Def: 1g).
# =====================================================================
# =====================================================================
# Generic options for the daemons used in the standalone deploy mode
# =====================================================================
export SPARK_PID_DIR=${SPARK_HOME}/pid # PID file location.
# =====================================================================
После запуска Spark MASTER и WORKERS в этой конфигурации я запускаю Jupyter, используя только две вкладки "Блокнот", которые указывают на этот автономный кластер Spark.
Моя проблема заключается в том, что только ячейки одной вкладки Блокнота - примерно на 5-ю или 6-ю ячейку - потребляют все ядра; оставив вторую вкладку голодной, остановив весь прогресс на второй вкладке, так как она ждет (но никогда не получает) ресурсов. Я могу подтвердить это в SparkUI: статус RUNNING для первой вкладки Notebook со всеми ядрами; и статус ОЖИДАНИЯ для второй вкладки с 0-Cores. И это несмотря на тот факт, что первый Блокнот завершил работу (т.е. достиг дна и завершил свою последнюю ячейку).
Кстати, это ожидание не ограничивается Jupyter. Если я в следующий раз запустлю Python/PySpark на CLI и подключусь к тому же кластеру, он тоже должен подождать.
Во всех трех случаях я получаю session
как это:
spark_sesn = SparkSession.builder.config(conf = spark_conf).getOrCreate()
Обратите внимание, что на этих вкладках ноутбука или в интерфейсе командной строки нет ничего сверхпрочного. Наоборот, это супер легкий (только для тестирования).
Я что-то неправильно настроил или неверная концепция распространения? Я думал, что здесь должно быть мультиплексирование, а не блокирование. Возможно, это проблема обмена сессиями? (т.е. .getOrCreate()
).
Я пытался играть с комбинацией CORES + WORKER-INSTANCES (например, 12 x 5 соответственно), но возникает та же проблема.
Хммм. Ну, я буду продолжать расследование (пора спать). знак равно
Заранее спасибо за ваш вклад и идеи.
0 ответов
Вы начали обслуживание в случайном порядке? Если нет, вам нужно сделать это следующим образом:
$SPARK_HOME_DIR/sbin/start-shuffle-service.sh
Затем вам нужно активировать dynamicAllocation и указать вашей sparkSession, что служба shuffle включена.
Для этого объявите это в вашем SparkConf():
spark.dynamicAllocation.enabled = true
spark.shuffle.service.enabled = true
Посмотрите на: https://spark.apache.org/docs/latest/configuration.html
Как только вы подождете "spark.dynamicAllocation.executorIdleTimeout", исполнители будут удалены. Вы можете увидеть это в автономном интерфейсе Master и в приложении Spark.
Еще одна хорошая ссылка: https://dzone.com/articles/spark-dynamic-allocation