我想按需执行Spark作业。因此,只有当我收到触发事件时,我才想使用通过此触发事件到达的输入执行Spark作业。由于触发事件不频繁,我不想使用Spark Streaming。 我的目标是在AWS EMR集群中部署该工具。我希望能够按需创建EMR集群(通过触发器),在那里执行Spark作业并关闭集群。 有没有关于如何从Scala处理这些操作的好例子?
答案 0 :(得分:1)
AWS Data Pipeline似乎是您定义的问题的正确解决方案。 AWS Data Pipeline允许您连接AWS基础架构中的多个服务范围,例如存储和处理。
您可以使用AWS Data管道中的EMRActivity创建EMR作业。管道将在满足前置条件或预定时间间隔时触发。
它将设置一个EMR集群,其中包含您指定的规范和您定义的Spark步骤
作业完成后,群集可以自动终止。
这个问题question将帮助您入门。
Choose a Template
选项创建管道时启动AWS Data Pipeline using this definition。对于此选项,您可以使用上面共享的模板。答案 1 :(得分:1)
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)
`
答案 2 :(得分:0)