基于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
相关产品推荐
相关产品推荐

