繁体   English   中英

从 Airflow 提交一个 spark 作业到外部 spark 容器

[英]Submit a spark job from Airflow to external spark container

我有一个 spark 和 airflow 集群,它是用 docker 群构建的。 Airflow 容器不能像我预期的那样包含 spark-submit。

我正在使用 github 中存在的以下图像

Spark:大数据欧洲/docker-hadoop-spark-workbench

Airflow: puckel/docker-airflow (CeleryExecutor)

我准备了一个 .py 文件并将其添加到 dags 文件夹下。

from airflow import DAG

from airflow.contrib.operators.spark_submit_operator import SparkSubmitOperator
from datetime import datetime, timedelta


args = {'owner': 'airflow', 'start_date': datetime(2018, 9, 24) }

dag = DAG('spark_example_new', default_args=args, schedule_interval="@once")

operator = SparkSubmitOperator(task_id='spark_submit_job', conn_id='spark_default', java_class='Main', application='/SimpleSpark.jar', name='airflow-spark-example',conf={'master':'spark://master:7077'},
        dag=dag)

我还在 web 站点中按如下方式配置连接:

在此处输入图像描述

Master是 spark master 容器的主机名。

但是它没有找到 spark-submit,它会产生以下错误:

[2018-09-24 08:48:14,063] {{logging_mixin.py:95}} INFO - [2018-09-24 08:48:14,062] {{spark_submit_hook.py:283}} INFO - Spark-Submit cmd: ['spark-submit', '--master', 'spark://master:7077', '--conf', 'master=spark://master:7077', '--name', 'airflow-spark-example', '--class', 'Main', '--queue', 'root.default', '/SimpleSpark.jar']

[2018-09-24 08:48:14,067] {{models.py:1736}} ERROR - [Errno 2] No such file or directory: 'spark-submit': 'spark-submit'
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/airflow/models.py", line 1633, in _run_raw_task
    result = task_copy.execute(context=context)
  File "/usr/local/lib/python3.6/site-packages/airflow/contrib/operators/spark_submit_operator.py", line 168, in execute
    self._hook.submit(self._application)
  File "/usr/local/lib/python3.6/site-packages/airflow/contrib/hooks/spark_submit_hook.py", line 330, in submit
    **kwargs)
  File "/usr/local/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/usr/local/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'spark-submit': 'spark-submit'

据我所知puckel/docker-airflow使用Python 超薄图像( https://hub.docker.com/_/python/ )。 此镜像不包含常用包,仅包含运行 python 所需的最小包。 因此,您需要扩展映像并在容器上安装spark-submit

编辑:Airflow 确实需要容器中的 spark 二进制文件来运行SparkSubmitOperator ,如此处所述

您可以使用的另一种方法是使用SSHOperator通过 SSH 连接到远程机器,在外部 VM 上运行spark-submit命令。 但是这里也应该可以使用 SSH,而这在 Puckel Airflow 中是不可用的。

  • 这是迟到的答案

  • 你应该安装apache-airflow-providers-apache-spark

  • 所以你应该创建一个名为“requirements.txt”的文件

  • 在文件 requirements.txt 中添加apache-airflow-providers-apache-spark

  • 像这样创建一个 Dockerfile

     FROM apache/airflow:2.2.3 # Install OpenJDK-11 RUN apt update && \ apt-get install -y openjdk-11-jdk && \ apt-get install -y ant && \ apt-get clean; # Set JAVA_HOME ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64/ RUN export JAVA_HOME USER airflow COPY requirements.txt. RUN pip install -r requirements.txt
  • 在 docker-compose.yml 注释行:

    # image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.2.3}

  • 并取消注释行构建。

最后运行

docker-compose build
docker-compose up

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM