You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在jupyter/pyspark-notebook镜像中增加Spark Executor数量?

问题:如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:23:25