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

基于Docker部署Airflow与Spark时SparkSubmit执行报错求助

解决方案:SparkSubmit Operator Java路径找不到问题

问题根源分析

报错/usr/lib/jvm/java-11-openjdk-amd64/bin/java: No such file or directory核心原因集中在三点:

  • Airflow容器中Java实际路径与手动设置的JAVA_HOME不匹配
  • Java可执行路径未加入系统PATH环境变量
  • Airflow容器缺少Spark客户端,导致spark-submit无法正确调用Java环境

具体修复步骤

1. 修正Airflow镜像的Java环境配置

修改Dockerfile.airflow,确保Java路径准确且全局可访问:

FROM apache/airflow:2.7.0
USER root

RUN apt-get update && \
    # 安装完整JDK而非仅JRE,满足Spark运行需求
    apt-get install -y procps openjdk-11-jdk-headless && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 通过系统工具自动获取正确JAVA_HOME路径,避免手动指定错误
RUN export JAVA_HOME=$(update-alternatives --query java | grep -m1 'Value:' | awk -F' ' '{print $2}' | sed 's/\/bin\/java//') && \
    echo "JAVA_HOME=$JAVA_HOME" >> /etc/environment

ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
# 将Java可执行路径加入全局PATH
ENV PATH=$PATH:$JAVA_HOME/bin

# Install dependencies
USER airflow

COPY requirements_for_docker.txt /tmp/requirements_for_docker.txt
RUN pip install --user --upgrade pip
RUN pip install --no-cache-dir --user -r /tmp/requirements_for_docker.txt
RUN pip install apache-airflow-providers-apache-spark==2.1.3

2. 在Airflow容器中安装Spark客户端

SparkSubmit Operator需要本地有Spark客户端才能执行spark-submit命令,在Dockerfile.airflow的USER root段添加以下内容:

# 下载与Spark集群版本匹配的Spark客户端(此处示例为3.4.1,需与bitnami/spark版本对齐)
RUN curl -O https://dlcdn.apache.org/spark/spark-3.4.1/spark-3.4.1-bin-hadoop3.tgz && \
    tar xzf spark-3.4.1-bin-hadoop3.tgz && \
    mv spark-3.4.1-bin-hadoop3 /opt/spark && \
    rm spark-3.4.1-bin-hadoop3.tgz

ENV SPARK_HOME=/opt/spark
# 将Spark命令加入全局PATH
ENV PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

3. 确认SparkSubmit Operator的DAG配置

在你的DAG代码中,确保Operator正确指向远程Spark集群:

from airflow.providers.apache.spark.operators.spark_submit import SparkSubmitOperator

spark_task = SparkSubmitOperator(
    task_id="spark_submit_task",
    application="/home/airflow/scripts/your_spark_job.py",
    conn_id="spark_default",
    spark_master="spark://spark:7077",  # 对应Spark集群的master地址
    executor_memory="1g",
    driver_memory="1g",
    num_executors=2,
)
  • 若使用Airflow连接管理,需在Airflow UI中配置spark_default连接,指定Spark master地址为spark://spark:7077

4. 重新构建镜像并启动服务

执行以下命令更新镜像并重启服务:

docker-compose -f docker-compose.airflow.yaml build
docker-compose -f docker-compose.airflow.yaml up -d

验证修复

进入Airflow scheduler容器,执行以下命令确认环境正常:

docker exec -it <airflow-scheduler-container-id> bash
java -version
spark-submit --version

若能正常输出版本信息,说明环境配置已修复。

内容的提问来源于stack exchange,提问作者Fiat Teetat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:05:54