Apache spark Airflow SparkSubmitOperator-如何在另一台服务器中激发提交

Apache spark Airflow SparkSubmitOperator-如何在另一台服务器中激发提交,apache-spark,hadoop,airflow,Apache Spark,Hadoop,Airflow,我不熟悉气流和火花,我正在努力使用火花Submitor 我们的airflow scheduler和hadoop群集不是在同一台机器上设置的(第一个问题:这是一种好的做法吗?) 我们有许多自动过程需要调用pyspark脚本。这些pyspark脚本存储在hadoop集群中(10.70.1.35)。气流DAG存储在气流机(10.70.1.22)中 目前,当我们想要spark提交带有airflow的pyspark脚本时,我们使用一个简单的Bash操作符,如下所示: cmd = "ssh hadoop@1

我不熟悉气流和火花,我正在努力使用火花Submitor

我们的airflow scheduler和hadoop群集不是在同一台机器上设置的(第一个问题:这是一种好的做法吗?

我们有许多自动过程需要调用pyspark脚本。这些pyspark脚本存储在hadoop集群中(10.70.1.35)。气流DAG存储在气流机(10.70.1.22)中

目前,当我们想要spark提交带有airflow的pyspark脚本时,我们使用一个简单的Bash操作符,如下所示:

cmd = "ssh hadoop@10.70.1.35 spark-submit \
   --master yarn \
   --deploy-mode cluster \
   --executor-memory 2g \
   --executor-cores 2 \
   /home/hadoop/pyspark_script/script.py"
t = BashOperator(task_id='Spark_datamodel',bash_command=cmd,dag=dag)
它工作得非常好。但是我们想开始使用SparkSubmitOperator来提交pyspark脚本

我试过这个:

from airflow import DAG
from datetime import timedelta, datetime
from airflow.contrib.operators.spark_submit_operator import 
SparkSubmitOperator
from airflow.operators.bash_operator import BashOperator
from airflow.models import Variable

dag = DAG('SPARK_SUBMIT_TEST',start_date=datetime(2018,12,10), 
schedule_interval='@daily')


sleep = BashOperator(task_id='sleep', bash_command='sleep 10',dag=dag)

_config ={'application':'hadoop@10.70.1.35:/home/hadoop/pyspark_script/test_spark_submit.py',
    'master' : 'yarn',
    'deploy-mode' : 'cluster',
    'executor_cores': 1,
    'EXECUTORS_MEM': '2G'
}

spark_submit_operator = SparkSubmitOperator(
    task_id='spark_submit_job',
    dag=dag,
    **_config)

sleep.set_downstream(spark_submit_operator) 
语法应该是正确的,因为dag不会显示为已断开。但当它运行时,它会给我以下错误:

[2018-12-14 03:26:42,600] {logging_mixin.py:95} INFO - [2018-12-14 
03:26:42,600] {base_hook.py:83} INFO - Using connection to: yarn
[2018-12-14 03:26:42,974] {logging_mixin.py:95} INFO - [2018-12-14 
03:26:42,973] {spark_submit_hook.py:283} INFO - Spark-Submit cmd: 
['spark-submit', '--master', 'yarn', '--executor-cores', '1', '--name', 
'airflow-spark', '--queue', 'root.default', 
'hadoop@10.70.1.35:/home/hadoop/pyspark_script/test_spark_submit.py']
[2018-12-14 03:26:42,977] {models.py:1760} ERROR - [Errno 2] No such 
file or directory: 'spark-submit'
Traceback (most recent call last):
      File "/home/dataetl/anaconda3/lib/python3.6/site- 
   packages/airflow/models.py", line 1659, in _run_raw_task    
    result = task_copy.execute(context=context)
      File "/home/dataetl/anaconda3/lib/python3.6/site- 
   packages/airflow/contrib/operators/spark_submit_operator.py", line 
168, 
    in execute
        self._hook.submit(self._application)
      File "/home/dataetl/anaconda3/lib/python3.6/site- 
   packages/airflow/contrib/hooks/spark_submit_hook.py", line 330, in 
submit
        **kwargs)
      File "/home/dataetl/anaconda3/lib/python3.6/subprocess.py", line 
707, 
    in __init__
        restore_signals, start_new_session)
      File "/home/dataetl/anaconda3/lib/python3.6/subprocess.py", line 
    1326, in _execute_child
        raise child_exception_type(errno_num, err_msg)
    FileNotFoundError: [Errno 2] No such file or directory: 'spark-submit'
以下是我的问题:

  • 我应该在我的气流机上安装spark hadoop吗?我这样问是因为在这篇文章中我读到我需要复制
    hdfs site.xml
    hive site.xml
    。但是你可以想象,我的气流机器上既没有
    /etc/hadoop/
    也没有
    /etc/hive/
    目录

  • a) 如果没有,我应该在我的气流机器上复制
    hdfs site.xml
    hive site.xml

  • b) 如果是,是否意味着我需要将气流机配置为客户端?一种不参与作业但可用于提交操作的边缘节点

  • 那么,我可以从我的气流机
    spark提交
    吗?如果可以,那么我就不需要像mysql数据库那样在气流上创建连接,对吗

  • 哦,还有蛋糕上的樱桃:我是否能够将我的pyspark脚本存储在我的气流机中,并从同一气流机提交它们。那太棒了

  • 任何评论都会非常有用,即使你不能回答我所有的问题


    无论如何先谢谢你!:)

    回答第一个问题,是的,这是一个很好的做法

    有关如何使用SparkSubmitOperator的信息,请参阅我在

  • ,您需要在机器上安装spark二进制文件
  • -
  • ->您仍然需要一个连接来告诉Airflow您在哪里安装了spark二进制文件。近似
  • 应该有用
  • “我的气流机器上既没有
    /etc/hadoop/
    也没有
    /etc/hive/
    目录”>>当您在没有完整hadoop客户端的服务器上安装Spark with hadoop libs时,必须在类路径中的目录中提供
    *-site.xml
    配置;使用spark submit时,设置
    $HADOOP\u CONF\u DIR
    并让脚本自己管理类路径就足够了