如何使用spark_task和pythonOperator从Airflow X_COM推入/拉出?

时间:2019-03-23 12:42:04

标签: python-3.x airflow directed-acyclic-graphs apache-airflow-xcom

我有一个dag,它创建一个spark任务并执行位于特定目录中的某个脚本。有两个这样的任务。在执行这些任务之前,这两个任务都需要接收DAG文件中生成的相同ID。如果我仅通过python脚本简单地存储和传递值,则ID是不同的,这很正常。因此,我尝试使用PythonOperator和Task将值推入XCOM。

我需要从XCOM提取值并使用该信息更新“ params”字典,以便能够将其传递给我的spark任务。

您能帮我吗,我撞到墙上的头,只是想不通。

我尝试了以下操作:

  • 创建一个仅用于从xcom检索数据并将其返回的函数。将此函数分配给params变量,但是不起作用。 我无法从使用xcom_pull函数的DAG中的python函数返回
  • 试图分配一个空列表并通过python函数添加到该列表。然后是直接提供给我的spark任务的最终列表。也不起作用。请帮忙!

非常感谢您提供与此相关的任何帮助。对于此任务以及可能会出现在同一DAG文件中的多个其他Spark任务,我将需要相同的值。

DAG文件

import..
from common.base_tasks import spark_task

default_args = {
    'owner': 'airflow',
    'start_date': days_ago(1),
    'email_on_failure': True,
    'email_on_retry': False,
}

dag = DAG(
    dag_id='dag',
    default_args=default_args,
    schedule_interval=timedelta(days=1)
)

log_level = "info"

id_info = {
        "id": str(uuid.uuid1()),
        "start_time": str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S,%f'))
    }

# this stores the value to XCOM successfully
def store_id(**kwargs):
    kwargs['ti'].xcom_push(key='id_info', value=id_info)

store_trace_task = PythonOperator(task_id='store_id', provide_context=True, python_callable=store_id, dag=dag)           

extra_config = {'log_level': log_level}

config = '''{"config":"data"}'''
params = {'config': config,'extra_config': json.dumps(extra_config}

# ---------- this doesn't work ----------
pars = []
pars.append(params)

def task1_pull_params(**kwargs):
    tracing = kwargs['ti'].xcom_pull(task_ids='store_trace_task')
    pars.append(tracing)
    # params = {
    #     'parsed_config': parsed_config,
    #     'extra_config': json.dumps(extra_config),
    #     'trace_data': tracing
    # }
    # return params     # return pushes to xcom, xcom_push does the same

task1_pull_params = PythonOperator(task_id='task1_pull_params', provide_context=True, python_callable=task1_pull_params, dag=dag)

store_trace_task >> task1_pull_params

# returning value from the function and calling it to assign res to the params variable below also doesn't work
# params = task1_pull_params

# this prints only what's outside of the function, i.e. params
print("===== pars =====> ", pars)

pipeline_task1 = spark_task(
    name='task1',
    script='app.py',
    params=params,
    dag=dag
    )

task1_pull_params >> pipeline_task1

0 个答案:

没有答案