作法:Airflow SparkSubmitOperator将值推送至xcom

时间:2019-06-10 15:30:35

标签: python airflow

在气流火花作业中,我需要将火花作业统计信息传递给工作流程中的其他任务。如何将值从SparkSubmitOperator推送到xcom?

task1 = SparkSubmitOperator(
    task_id='spark_task',
    conn_id='spark_default',
    java_class='com.example',
    application='example.jar',
    name='spark-job',
    verbose=True,
    application_args=["10"],  
    conf={'master':'yarn'},
    dag=dag,
)


#pass value from task1 to task 2 via xcom

def somefunc(**kwargs):
    #pull value from task1
    kwargs["ti"].xcom_pull(task_ids='spark_task')

task2 = PythonOperator(task_id='task2',
                       python_callable=somefunc,
                       provide_context=True,
                       dag=dag)

1 个答案:

答案 0 :(得分:0)

当前,SparkSubmitOperator / SparkSubmitHook并非旨在将作业统计信息返回给XCom。您可以轻松地更新操作员以适应您的需求:

from airflow.contrib.operators.spark_submit_operator import SparkSubmitOperator

class SparkSubmitOperatorXCom(SparkSubmitOperator):

    def execute(self, context):
        super().execute(context)
        return self._hook._driver_status

然后,您可以初始化运算符,以将execute方法的返回结果发送给XCom:

task1 = SparkSubmitOperatorXCom(
    do_xcom_push=True,
    ...
)

注意:在这种情况下,我们正在访问私有财产。这是SparkSubmitHook提供驱动程序状态的唯一方法。对于更复杂的工作统计信息,您将必须实施自己的解决方案,因为该挂钩似乎不够灵活,无法为您提供一切。