Airflow 在EMR运算符中使用Json输入变量

Airflow 在EMR运算符中使用Json输入变量,airflow,amazon-emr,airflow-operator,Airflow,Amazon Emr,Airflow Operator,我目前正在遵循这里给出的模板:使用spark submit创建一个DAG来调用一个emr实例。在设置spark_test_步骤时,我需要包含从POST Json传入的变量,以填充spark submit,如下所示: SPARK_TEST_STEPS = [ { 'Name': 'calculate_pi', 'ActionOnFailure': 'CONTINUE', 'HadoopJarStep': { 'Jar'

我目前正在遵循这里给出的模板:使用spark submit创建一个DAG来调用一个emr实例。在设置spark_test_步骤时,我需要包含从POST Json传入的变量,以填充spark submit,如下所示:

SPARK_TEST_STEPS = [
    {
        'Name': 'calculate_pi',
        'ActionOnFailure': 'CONTINUE',
        'HadoopJarStep': {
            'Jar': 'command-runner.jar',
            'Args': [
                '/usr/lib/spark/bin/run-example',
                'SparkPi',
                kwargs['dag_run'].conf['var_1']
                kwargs['dag_run'].conf['var_2']
                kwargs['dag_run'].conf['var_3']
                '10'
            ]
        }
    }
]
我如何在仍然遵循git链接中给出的格式的情况下传入PostJSON给出的变量,如下所示

from datetime import timedelta

import airflow
from airflow import DAG
from airflow.contrib.operators.emr_create_job_flow_operator \
    import EmrCreateJobFlowOperator
from airflow.contrib.operators.emr_add_steps_operator \
    import EmrAddStepsOperator
from airflow.contrib.sensors.emr_step_sensor import EmrStepSensor
from airflow.contrib.operators.emr_terminate_job_flow_operator \
    import EmrTerminateJobFlowOperator

DEFAULT_ARGS = {
    'owner': 'Airflow',
    'depends_on_past': False,
    'start_date': airflow.utils.dates.days_ago(2),
    'email': ['airflow@example.com'],
    'email_on_failure': False,
    'email_on_retry': False
}

SPARK_TEST_STEPS = [
    {
        'Name': 'calculate_pi',
        'ActionOnFailure': 'CONTINUE',
        'HadoopJarStep': {
            'Jar': 'command-runner.jar',
            'Args': [
                '/usr/lib/spark/bin/run-example',
                'SparkPi',
                kwargs['dag_run'].conf['var_1']
                kwargs['dag_run'].conf['var_2']
                kwargs['dag_run'].conf['var_3']
                '10'
            ]
        }
    }
]

JOB_FLOW_OVERRIDES = {
    'Name': 'PiCalc'
}

dag = DAG(
    'emr_job_flow_manual_steps_dag',
    default_args=DEFAULT_ARGS,
    dagrun_timeout=timedelta(hours=2),
    schedule_interval='0 3 * * *'
)

cluster_creator = EmrCreateJobFlowOperator(
    task_id='create_job_flow',
    job_flow_overrides=JOB_FLOW_OVERRIDES,
    aws_conn_id='aws_default',
    emr_conn_id='emr_default',
    dag=dag
)

step_adder = EmrAddStepsOperator(
    task_id='add_steps',
    job_flow_id="{{ task_instance.xcom_pull('create_job_flow', key='return_value') }}",
    aws_conn_id='aws_default',
    steps=SPARK_TEST_STEPS,
    dag=dag
)

step_checker = EmrStepSensor(
    task_id='watch_step',
    job_flow_id="{{ task_instance.xcom_pull('create_job_flow', key='return_value') }}",
    step_id="{{ task_instance.xcom_pull('add_steps', key='return_value')[0] }}",
    aws_conn_id='aws_default',
    dag=dag
)

cluster_remover = EmrTerminateJobFlowOperator(
    task_id='remove_cluster',
    job_flow_id="{{ task_instance.xcom_pull('create_job_flow', key='return_value') }}",
    aws_conn_id='aws_default',
    dag=dag
)

cluster_creator.set_downstream(step_adder)
step_adder.set_downstream(step_checker)
step_checker.set_downstream(cluster_remover)

我昨天处理了一个类似的问题,并用这样的解决方案解决了它。如果您有一个包含JSON的文件,您应该能够使用通过Admin->Variables设置的变量

使用PythonOperator读入JSON文件并将其保存为局部变量,使用
variable.set(“变量名”,JSON内容变量)
将其设置为气流变量

然后,您可以通过调用
steps=Variable.get(“Variable\u NAME”,deserialize\u JSON=True)


希望这能有所帮助。

但我不明白为什么有人想使用任务(
PythonOperator
)设置和
aiffair
变量),当同样的事情可以通过WebUI完成时——至少就我使用aiffair的目的而言,我不能依赖通过UI手动设置的变量。我需要在代码中动态创建变量。