java-从S3事件触发AWS EMR Spark作业


0

我正在考虑使用AWS EMR Spark对存储在S3上的非常大的 parquet file运行Spark应用程序。这里的总体流程是Java进程将这些大文件上传到S3,我希望自动触发在这些文件上运行Spark作业(注入上传文件的S3密钥名)。

理想情况下,可以使用某种基于S3的EMR触发器来 join;也就是说,我将EMR/Spark配置为“监听”S3存储桶,并在对该存储桶进行upsertis时启动Spark作业。

如果不存在这样的触发器,我可能会把一些东西混在一起,比如从S3事件中启动Lambda,然后让Lambda以某种方式触发EMR Spark作业。

然而,我的理解(如果我错了,请纠正我)是,启动一个 spark job的唯一方法是:

    将作业打包为一个可执行的JAR文件

因此,如果我必须做基于Lambda的kludge,我不确定触发EMR/Spark任务的最佳方法是什么,因为Lambda在运行时并不是天生携带Spark submit。即使我配置了自己的Lambda运行时(我相信现在可以这样做),这个解决方案已经让人觉得非常不可靠,而且不能容忍错误。

以前有人用S3触发器或AWS触发器触发过EMR/Spark作业吗?

1 答案


0

EMR Spark作业可以作为添加Spark步骤中的步骤执行。步骤不只是在启动后的EMR集群创建时间。

aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Type=Spark,Name="Spark Program",ActionOnFailure=CONTINUE,Args=[--class,org.apache.spark.examples.SparkPi,/usr/lib/spark/examples/jars/spark-examples.jar,10]

由于它是一个AWS CLI,您可以从Lambda调用它,在Lambda中还可以将jar文件上载到 HDFSS或S3,然后使用S3:/或硬盘驱动器://。

该文档还有一个Java示例。

AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonElasticMapReduce emr = new AmazonElasticMapReduceClient(credentials);

StepFactory stepFactory = new StepFactory();
AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials);
AddJobFlowStepsRequest req = new AddJobFlowStepsRequest();
req.withJobFlowId("j-1K48XXXXXXHCB");

List<StepConfig> stepConfigs = new ArrayList<StepConfig>();

HadoopJarStepConfig sparkStepConf = new HadoopJarStepConfig()
.withJar("command-runner.jar")
.withArgs("spark-submit","--executor-memory","1g","--class","org.apache.spark.examples.SparkPi","/usr/lib/spark/examples/jars/spark-examples.jar","10");

StepConfig sparkStep = new StepConfig()
.withName("Spark Step")
.withActionOnFailure("CONTINUE")
.withHadoopJarStep(sparkStepConf);

stepConfigs.add(sparkStep);
req.withSteps(stepConfigs);
AddJobFlowStepsResult result = emr.addJobFlowSteps(req);


我来回答

写文章

提问题

面试题