【问题标题】:Submit a spark job from Airflow to external spark container从 Airflow 向外部火花容器提交火花作业
【发布时间】:2018-09-24 09:03:56
【问题描述】:

我有一个使用 docker swarm 构建的火花和气流集群。气流容器不能像我预期的那样包含 spark-submit。

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

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

气流: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)

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

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'

【问题讨论】:

  • 你能找到 spark-submit 吗?也许您必须将其添加到 PATH
  • 包含 spark-submit 的机器是另一个容器,如何将 spark-submit 添加到包含气流的容器中?
  • 你可以扩展airflow Docker镜像并安装Spark,或者尝试只复制/粘贴spark-submit bin。

标签: docker apache-spark airflow


【解决方案1】:

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

编辑:Airflow 确实需要容器中的 spark 二进制文件才能运行 SparkSubmitOperator,如文档中的 here 所述。

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

【讨论】:

  • 我知道,但气流的目的是调度不是吗?我想在我的 spark 容器中运行 spark-submit 命令。
  • 编辑了答案。
  • 有没有包含 ssh 和 celery 的图片?
  • 我建议您改用 Centos 映像并使用文档中的说明安装气流,然后只需执行 pip install apache-airflow[ssh]
【解决方案2】:
  • 这是迟到的答案

  • 你应该安装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}

  • 并取消注释行 build 。

终于运行

docker-compose build
docker-compose up

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多