代码之家  ›  专栏  ›  技术社区  ›  Markus

如何按需创建EMR集群并执行aws EMR命令?

  •  1
  • Markus  · 技术社区  · 8 年前

    我想按需执行Spark作业。因此,只有当我收到一个触发事件时,我才想使用这个触发事件到达的输入来执行一个Spark作业。由于触发器事件并不频繁,我不想使用Spark流。 我的目标是在AWS EMR集群中部署该工具。我希望能够按需创建EMR集群(通过触发器),在那里执行Spark作业并关闭集群。 有没有关于如何从Scala处理这些操作的好例子?

    3 回复  |  直到 8 年前
        1
  •  4
  •   Atish    8 年前
    • AWS Data Pipeline 似乎是您定义的问题的正确解决方案。AWS数据管道允许您连接AWS基础架构中的多个服务范围,如存储和处理。

    • 您可以在AWS数据管道中使用EMR创建EMR作业。管道将在满足前提条件或按计划的时间间隔触发。

    • 它将使用您指定的规范和您定义的Spark步骤设置EMR群集

    • 作业完成后,可以自动终止群集。

    question 打开SO将让您开始。

    • 您还可以启动AWS数据管道 using this definition 使用创建管道时 Choose a Template 选项对于此选项,可以使用上面共享的模板。
        2
  •  1
  •   Francisco Cantero    6 年前

    只要Lambda函数允许启动EMR集群,它就可能是一个很好的解决方案。Lambda函数可以根据需要启动,也可以使用许多不同的触发器来调用。

    这可能是一个很好的模板,可以开始设置Lambda函数:

    `

    import sys
    import time
    
    import boto3
    
    def lambda_handler(event, context):
        conn = boto3.client("emr")
        # chooses the first cluster which is Running or Waiting
        # possibly can also choose by name or already have the cluster id
        clusters = conn.list_clusters()
        # choose the correct cluster
        clusters = [c["Id"] for c in clusters["Clusters"] 
                    if c["Status"]["State"] in ["RUNNING", "WAITING"]]
        if not clusters:
            sys.stderr.write("No valid clusters\n")
            sys.stderr.exit()
        # take the first relevant cluster
        cluster_id = clusters[0]
        # code location on your emr master node
        CODE_DIR = "/home/hadoop/code/"
    
        # spark configuration example
        step_args = ["/usr/bin/spark-submit", "--spark-conf", "your-configuration",
                     CODE_DIR + "your_file.py", '--your-parameters', 'parameters']
    
        step = {"Name": "what_you_do-" + time.strftime("%Y%m%d-%H:%M"),
                'ActionOnFailure': 'CONTINUE',
                'HadoopJarStep': {
                    'Jar': 's3n://elasticmapreduce/libs/script-runner/script-runner.jar',
                    'Args': step_args
                }
            }
        action = conn.add_job_flow_steps(JobFlowId=cluster_id, Steps=[step])
        return "Added step: %s"%(action)
    

    `

        3
  •  0
  •   chendu    6 年前
    1. 与其通过api旋转EMR集群,不如使用EMR 在云形成模板中配置并启动云形成 模板(CFT)。通过CFT,您可以处理IAM角色,创建S3 铲斗等
    2. 通过lambda旋转EMR集群;如果有任何正在进行或等待的火花作业,则让另一个lambda监控EMR。如果没有 空闲时间(如15分钟) ,然后在CFT上发出拆除指令,inturn终止EMR