如何在jupyter/pyspark-notebook镜像中增加Spark Executor数量?
我正在使用PySpark开展项目,需要更多Executor。目前使用便捷的jupyter/pyspark-notebook镜像,它会自动创建集成PySpark的Jupyter Notebook,使用体验极佳,但该镜像默认仅创建1个Executor,存储内存仅为434.4 MiB。
是否有办法为这个Docker镜像配置更多Executor?我在网上找到不少从零搭建多Executor的docker-compose配置,但从零搭建工作量过大;不过若无快速方案,也愿意尝试从零搭建。
我的docker-compose文件:
jupyter: container_name: jupyter_pyspark build: . ports: - "8888:8888" - "4040:4040" - "4041:4041" environment: - JUPYTER_ENABLE_LAB=yes volumes: - ./work:/home/jovyan/work hostname: localhost command: "start-notebook.sh --NotebookApp.token='' --NotebookApp.password=''"
我的Dockerfile:
FROM jupyter/pyspark-notebook # Change to root user to install java 8 USER root # Install requirements # COPY requirements.txt ./ # RUN pip3 install -r requirements.txt # RUN rm -rf requirements.txt EXPOSE 8088 8042 4040 USER $NB_UID
备注:我尝试修改配置变量但未成功,猜测可能需要在docker-compose中添加更多服务,但不知道如何与当前镜像关联。
我的SparkSession代码:
from pyspark.sql import SparkSession import pyspark.sql.functions as f from pyspark.sql.types import * spark = SparkSession \ .builder \ .config(conf=sparkConf) \ .master("local[*]") \ .appName("appYou") \ .getOrCreate()
方案一:快速调整现有镜像(无需从零搭建)
1. 直接在SparkSession中指定Executor参数
你当前用的master("local[*]")是本地单JVM模拟集群模式,*代表使用所有可用CPU核心,但默认内存限制较低。可以直接在SparkSession构建时添加配置提升资源:
from pyspark.sql import SparkSession from pyspark import SparkConf sparkConf = SparkConf() \ .set("spark.executor.instances", "3") # 指定Executor数量 .set("spark.executor.memory", "2g") # 每个Executor内存 .set("spark.driver.memory", "2g") # Driver内存(按需调整) .set("spark.executor.cores", "2") # 每个Executor的CPU核心数 spark = SparkSession \ .builder \ .config(conf=sparkConf) \ .master("local[*]") \ .appName("appYou") \ .getOrCreate()
注意:此模式下的“Executor”是同一JVM内的线程,并非真正分布式节点,但足以提升本地并行处理能力。
2. 通过Docker环境变量预设全局Spark配置
在docker-compose的environment中添加Spark全局参数,所有SparkSession都会默认继承:
修改后的docker-compose.yml:
jupyter: container_name: jupyter_pyspark build: . ports: - "8888:8888" - "4040:4040" - "4041:4041" environment: - JUPYTER_ENABLE_LAB=yes # Spark全局配置 - SPARK_EXECUTOR_INSTANCES=3 - SPARK_EXECUTOR_MEMORY=2g - SPARK_DRIVER_MEMORY=2g - SPARK_EXECUTOR_CORES=2 volumes: - ./work:/home/jovyan/work hostname: localhost command: "start-notebook.sh --NotebookApp.token='' --NotebookApp.password=''"
也可以在Dockerfile中直接设置环境变量:
FROM jupyter/pyspark-notebook USER root # 设置Spark全局配置环境变量 ENV SPARK_EXECUTOR_INSTANCES=3 ENV SPARK_EXECUTOR_MEMORY=2g ENV SPARK_DRIVER_MEMORY=2g ENV SPARK_EXECUTOR_CORES=2 EXPOSE 8088 8042 4040 USER $NB_UID
方案二:搭建真正的分布式Spark集群(多Executor节点)
如果需要独立进程/节点的分布式Executor,可以扩展docker-compose添加Spark Master和Worker服务:
1. 修改docker-compose.yml添加集群服务
version: '3' services: spark-master: image: bitnami/spark:latest container_name: spark-master environment: - SPARK_MODE=master - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no ports: - "8080:8080" - "7077:7077" volumes: - ./work:/opt/bitnami/spark/work spark-worker-1: image: bitnami/spark:latest container_name: spark-worker-1 environment: - SPARK_MODE=worker - SPARK_MASTER_URL=spark://spark-master:7077 - SPARK_WORKER_MEMORY=2g - SPARK_WORKER_CORES=2 - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no volumes: - ./work:/opt/bitnami/spark/work depends_on: - spark-master spark-worker-2: image: bitnami/spark:latest container_name: spark-worker-2 environment: - SPARK_MODE=worker - SPARK_MASTER_URL=spark://spark-master:7077 - SPARK_WORKER_MEMORY=2g - SPARK_WORKER_CORES=2 - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no volumes: - ./work:/opt/bitnami/spark/work depends_on: - spark-master jupyter: container_name: jupyter_pyspark build: . ports: - "8888:8888" - "4040:4040" environment: - JUPYTER_ENABLE_LAB=yes # 指定Spark Master地址 - SPARK_MASTER=spark://spark-master:7077 volumes: - ./work:/home/jovyan/work depends_on: - spark-master command: "start-notebook.sh --NotebookApp.token='' --NotebookApp.password=''"
2. 修改Dockerfile配置集群地址
FROM jupyter/pyspark-notebook USER root # 设置Spark Master地址环境变量 ENV SPARK_MASTER=spark://spark-master:7077 EXPOSE 8088 8042 4040 USER $NB_UID
3. 修改SparkSession连接集群
from pyspark.sql import SparkSession spark = SparkSession \ .builder \ .master("spark://spark-master:7077") # 指向Spark Master .appName("appYou") \ .config("spark.executor.memory", "2g") \ .getOrCreate()
每个spark-worker就是一个独立的Executor节点,可根据需求添加更多worker服务。
内容的提问来源于stack exchange,提问作者Cristian Favaro Carriço

