在完成步骤之前调用Airflow Emr集群终止

时间:2019-05-31 10:43:56

标签: python apache-spark boto3 airflow amazon-emr

我正在EMR上启动集群,并使用气流对其进行一些操作。

我想要什么:

我想在通过EmrAddStepsOperator添加的所有步骤完成后终止集群

我尝试过的事情:

我曾尝试同时使用EmrStepSensorEmrTerminateJobFlowOperator,但是我的火花步骤被取消了,并且群集没有完成所有步骤而终止了

任何人请提出正确的做法。这是我的代码

dag = DAG('emr_job_flow_automatic_steps_17',
         default_args=default_args,
         schedule_interval="@daily",
         max_active_runs=1,
         catchup=True,
)


upload_to_S3_task = PythonOperator(
   task_id='upload_to_S3',
   python_callable=upload_file_to_S3,
   op_kwargs={
       'filename': '/home/ab/projects/test.py',
       'key': 'test.py',
       'bucket_name': 'dep-buck',
   },
   dag=dag)

cluster_creator = EmrCreateJobFlowOperator(
   task_id='create_job_flow2',
   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_flow2', key='return_value') }}",
   aws_conn_id='aws_default',
   steps=step,
   dag=dag
)
step_checker = EmrStepSensor(
   task_id='watch_step',
   job_flow_id="{{ task_instance.xcom_pull('create_job_flow2', 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_flow2', key='return_value') }}",
   aws_conn_id='aws_default',
   dag=dag
)

upload_to_S3_task >> cluster_creator >> step_adder >> step_checker >> cluster_remover

关于堆栈溢出的其他问题:

关于stackoverflow有一个类似的问题,但是没有得到正确的答案(使用EmrTerminateJobFlowOperator)

2 个答案:

答案 0 :(得分:0)

所以我设法做到了。问题是我将EmrStepSensor的所有步骤作为一个stepadder进行了处理,因此一旦完成,它就会终止集群。

解决方案是分离所有步骤,并将最后的步骤ID赋予EmrStepSensor。另外,我仅将具有单独步骤加法器(step_adder_actual_step)的最后一步与其他步骤分开,并将其提供给EmrStepSensor

step_adder_pre_step = EmrAddStepsOperator(
    task_id='pre_step',
    job_flow_id="{{ task_instance.xcom_pull('create_job_flow2', key='return_value') }}",
    aws_conn_id='aws_default',
    steps=pre_step,
    dag=dag
)

step_adder_actual_step = EmrAddStepsOperator(
    task_id='actual_step',
    job_flow_id="{{ task_instance.xcom_pull('create_job_flow2', key='return_value') }}",
    aws_conn_id='aws_default',
    steps=actual_step,
    dag=dag
)

step_checker = EmrStepSensor(
    task_id='watch_step',
    job_flow_id="{{ task_instance.xcom_pull('create_job_flow2', key='return_value') }}",
    step_id="{{ task_instance.xcom_pull('actual_step', 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_flow2', key='return_value') }}",
    aws_conn_id='aws_default',
    dag=dag
)

cluster_creator >> step_adder_pre_step >> step_adder_actual_step >> step_checker >> cluster_remover 

答案 1 :(得分:0)

我遇到了同样的问题,EMR仅执行了一个步骤并终止。

SOLUTION: on step_checker -> step_id, change [0] for .pop()