На достаточно оборудованном 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 всего с двумя вкладками Notebook, которые указывают на этот автономный кластер Spark.
Моя проблема в том, что только одна вкладка Notebook с ячейками - примерно 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 соответственно), но возникает та же проблема.
Хм. Что ж, я продолжу расследование (пора спать). знак равно
Заранее благодарим вас за ваш вклад и идеи.