我在AWS中已有一个EMR集群。我想从气流运行到aws现有集群

时间:2019-10-14 15:15:16

标签: airflow amazon-emr airflow-scheduler airflow-operator

我有一台具有apache-airflow == 1.10.5版本的气流机。我知道如何运行自动创建集群的dag并运行该步骤并终止集群。使用气流UI中的连接,我能够实现这一目标。但是要在现有的aws emr群集上运行dag,我无法知道需要在连接中传递哪些参数。

AIRFLOW UI->管理员->连接->创建的Conn ID(EMR Default1),conn类型为Elastic Mapreduce。

[2019-10-14 12:12:40,919] {taskinstance.py:1051} ERROR - Parameter validation failed:
Missing required parameter in input: "Instances"
Traceback (most recent call last):
  File "/root/anaconda3/envs/airflow/lib/python3.6/site-packages/airflow/models/taskinstance.py", line 926, in _run_raw_task
    result = task_copy.execute(context=context)
  File "/root/anaconda3/envs/airflow/lib/python3.6/site-packages/airflow/contrib/operators/emr_create_job_flow_operator.py", line 68, in execute
    response = emr.create_job_flow(self.job_flow_overrides)
  File "/root/anaconda3/envs/airflow/lib/python3.6/site-packages/airflow/contrib/hooks/emr_hook.py", line 55, in create_job_flow
    response = self.get_conn().run_job_flow(**config)
  File "/root/anaconda3/envs/airflow/lib/python3.6/site-packages/botocore/client.py", line 314, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/root/anaconda3/envs/airflow/lib/python3.6/site-packages/botocore/client.py", line 586, in _make_api_call
    api_params, operation_model, context=request_context)
  File "/root/anaconda3/envs/airflow/lib/python3.6/site-packages/botocore/client.py", line 621, in _convert_to_request_dict
    api_params, operation_model)
  File "/root/anaconda3/envs/airflow/lib/python3.6/site-packages/botocore/validate.py", line 291, in serialize_to_request
    raise ParamValidationError(report=report.generate_report())
botocore.exceptions.ParamValidationError: Parameter validation failed:
Missing required parameter in input: "Instances"
[2019-10-14 12:12:40,920] {taskinstance.py:1082} INFO - Marking task as FAILED.

1 个答案:

答案 0 :(得分:1)

在第一种情况下,您也可以通过扩展SparkSubmitOperator运算符来实现此目标,而不是使用UI动态创建/终止集群。启动EMR群集后,您可以将* .xml(例如, core-site.xml )文件从EMR主文件复制到气流节点上的某个位置,然后在“火花提交”任务中指向这些文件在气流中。至少我们那天在产品中做到这一点。为了进行逻辑上的扩展,如果您打算重用现有集群,那么您所需要做的就是知道这些* .xml文件已存储在何处。然后,其余部分将相同。触发任务时只需要引用这些文件。

更多详细信息

我对此类文档一无所知,因此我建议您根据我所掌握的知识探索以下内容:

  1. 我们需要编写一个用于提交火花的自定义插件。作为此自定义插件模块的一部分,让我们定义一个CustomSparkSubmitOperator类。它需要扩展BaseOperator。您可以找到许多有关在气流中编写自定义插件的文章。 This可能是一个不错的起点。 Here,您可以查看BaseOperator的更多详细信息。

  2. BaseOperator中,您将找到一个名为pre_execute的方法。在此方法中执行以下操作是一个可行的选择:

    a。等待集群启动。如果传递了cluster-id,则可以使用boto3轻松实现。

    b。群集启动后,获取EMR主节点的ip,并将与/etc/hadoop/conf/*-site.xml相匹配的内容复制到您的气流节点。这可以通过python中的子进程调用来实现。

  3. 一旦有了xml文件,就可以使用execute方法,只需使用SparkSubmitHook来提交您的spark-job。您需要确保气流节点上的火花二进制文件使用此路径进行火花提交。

  4. 如果需要,可以使用post_execute方法清理群集。