在气流火花作业中,我需要将火花作业统计信息传递给工作流程中的其他任务。如何将值从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)
答案 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提供驱动程序状态的唯一方法。对于更复杂的工作统计信息,您将必须实施自己的解决方案,因为该挂钩似乎不够灵活,无法为您提供一切。