我有Airflow作业,这些作业在EMR群集上运行良好。我需要的是,如果我有4个气流作业,而这需要一个EMR集群,比如说20分钟才能完成任务。为什么不可以在DAG运行时创建EMR集群,而一旦作业完成,它将终止创建的EMR集群。
答案 0 :(得分:1)
检查我的实现,DAG将创建emr集群并针对s3中的数据运行spark作业,并在完成后自动终止。
https://beyondexperiment.com/vijayravichandran06/aws-emr-orchestrate-with-airflow/
答案 1 :(得分:0)
执行此操作的最佳方法可能是在Airflow DAG的根部有一个节点,该节点创建EMR群集,然后在DAG的末尾有另一个节点,该节点在所有其他节点之后将群集降速已经完成。
答案 2 :(得分:0)
当然,那将是最有效地利用资源。让我警告您:这里有很多细节;我会尝试列出尽可能多的清单。我鼓励您添加自己的综合答案,列出遇到的任何问题和解决方法(一旦您完成此操作)
关于群集的创建/终止
对于集群的创建和终止,您分别拥有EmrCreateJobFlowOperator
和EmrTerminateJobFlowOperator
如果您不使用AWS
SecretAccessKey
(并完全依靠IAM
Roles),请不要担心;实例化AWS
中与hook
相关的operator
或Airflow
的任何实例automatically fall-back to underlying EC2
's attached IAM
Role
如果您不使用 EMR-Steps API 提交作业,那么您还必须使用以下方法手动检测上述两项操作Sensors
。已经有一个名为EmrJobFlowSensor
的用于轮询创建的传感器,您可以对其进行一些修改以创建一个用于终止的传感器
您在job_flow_extra
中传递集群配置JSON。您也可以在Connection
(如my_emr_conn
)extra
param中传递配置,但不要这么做,因为它经常会中断SQLAlchemy
ORM加载(因为它的{ 1}})
关于工作提交
您可以使用EMR-Steps API将作业提交到json
,这可以在群集创建阶段(在Cluster-Configs JSON中)或之后使用add_job_flow_steps()
完成。 Emr
中甚至有一个emr_add_steps_operator()
,它也需要一个EmrStepSensor
。您可以在AWS
docs中阅读有关此内容的更多信息,并且可能还必须使用command-runner.jar
对于特定于应用程序的情况(例如Airflow
,Hive
),可以使用它们的特定方式。例如,您可以使用HiveServer2Hook
来提交Livy
作业。这是一个棘手的部分:run_job_flow()
call(在集群创建阶段创建)仅给您Hive
(集群ID)。您必须使用describe_cluster()
call和EmrHook
来获取主节点的私有IP 。这样,您便可以programmatically create a Connection
(例如Hive Server 2 Thrift
connection)并将其用于将计算提交到群集。而且,不要忘记在完成工作流程之前删除这些连接(为了美观)。
最后,是用于与集群交互的老式bash。为此,您还应该传递一个EC2
key pair during cluster creation phase。之后,您可以以编程方式创建一个SSH
connection并将其(与SSHHook
或SSHOperator
一起使用)在集群上运行作业。在job_flow_id
here
特别是对于提交Airflow
个作业到远程 Spark
集群,请阅读this discussion