开发者社区> 问答> 正文

从S3事件触发AWS EMR Spark作业

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

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

如果不存在这样的触发器,我可能会把某些事情融合在一起,例如从S3事件中启动Lambda,并让Lambda以某种方式触发EMR Spark作业。

但是我的理解(如果我错了,请纠正我)是开始Spark工作的唯一方法是:

  1. 将作业打包为可执行的JAR文件;和
  2. shell脚本将其提交到集群(EMR或其他方式)spark-submit

因此,如果我必须执行基于Lambda的合并,那么我不确定Lambda本身不是spark-submit在运行时中执行的,因此触发EMR / Spark作业的最佳方法是什么。即使我配置了自己的Lambda运行时(我相信现在可以做到),该解决方案也已经感觉到了真正的问题和容错。

有人曾经从S3触发器或任何 AWS触发器触发过EMR / Spark作业吗?

问题来源:Stack Overflow

展开
收起
montos 2020-03-27 10:02:01 813 0
1 条回答
写回答
取消 提交回答
  • 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调用它,也可以在其中将jar文件上传到HDFS或S3,然后使用s3://或hdfs://指向它。

    该文档还有一个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);
    

    回答来源:Stack Overflow

    2020-03-27 22:04:15
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载