我正在EMR上启动集群,并使用气流对其进行一些操作。
我想要什么:
我想在通过EmrAddStepsOperator
添加的所有步骤完成后终止集群
我尝试过的事情:
我曾尝试同时使用EmrStepSensor
和EmrTerminateJobFlowOperator
,但是我的火花步骤被取消了,并且群集没有完成所有步骤而终止了
任何人请提出正确的做法。这是我的代码
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)
答案 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()