【问题标题】:Call multiple spark jobs within single EMR cluster在单个 EMR 集群中调用多个 Spark 作业
【发布时间】:2019-08-21 14:32:48
【问题描述】:

我想在单个 EMR 集群中使用 spark-submit 调用多个 spark 作业。 EMR 支持吗? 如何做到这一点? 我现在使用 AWS Lambda 为我的 spark 作业调用 EMR 作业,但我们希望扩展到单个 EMR 集群中的多个 spark 作业。

【问题讨论】:

  • 您需要并行运行它们,还是一个接一个地运行?您是否使用 AWS sdk 来启动 spark 作业?
  • 请并行使用 spark-submit
  • 对不起,我有一个使用 spark 提交的解决方案,它是顺序的而不是并行的。我不确定如何在一个 EMR 中运行并行作业。
  • 没关系。我们也可以考虑顺序处理。
  • 我使用适合我的 EMR 步骤添加了实现。

标签: apache-spark aws-lambda amazon-emr


【解决方案1】:

您可以在一个 EMR 上按顺序运行多个 Spark 作业 - 也就是说,下一个作业将在前一个作业完成后启动。这是使用 EMR 步骤完成的。

我使用 Java SDK 来运行它,但您可以在此文档中看到 how to add step using CLI only。

我下面的代码使用 spark-submit,但它不像在 CLI 中那样直接运行。相反,我将它作为 shell 脚本运行,并为 HADOOP_USER_NAME 包含了一个环境变量,因此 spark 作业在我指定的用户名下运行。如果您想使用您登录 EMR 的用户名(默认情况下为 hadoop)运行作业,则可以跳过它。

在下面的代码摘录中,对象emr 的类型为AmazonElasticMapReduce,在sdk 中提供。如果您使用的是 CLI 方法,则不需要它。

uploadConfFile 等一些辅助方法是不言自明的。我为 spark 应用程序使用了广泛的配置,与 files 和 jars 可以在本地或在 s3/hdfs 中不同,配置文件必须在 EMR 本身的本地文件中。

完成后,您将在 EMR 集群上创建一个步骤,该步骤将启动一个新的 spark 应用程序。您可以在 EMR 上指定多个步骤,这些步骤将一个接一个地运行。

//Upload the spark configuration you wish to use to a local file    
uploadConfFile(clusterId, sparkConf, confFileName);

//create a list of arguments - which is the complete command for spark-submit
List<String> stepargs = new ArrayList<String>();
//start with an envelope to specify the hadoop user name
stepargs.add("/bin/sh");
stepargs.add("-c");
//call to spark-submit with the incantation stating its arguments are provided next.
stepargs.add("HADOOP_USER_NAME="+task.getUserName()+" spark-submit \"$@\"");
stepargs.add("sh");
//add the spark-submit arguments
stepargs.add("--class");
stepargs.add(mainClass);
stepargs.add("--deploy-mode");
stepargs.add("cluster");
stepargs.add("--master");
stepargs.add("yarn");
stepargs.add("--files");
//a comma-separated list of file paths in s3
stepargs.add(files);
stepargs.add("--jars");
//a comma-separated list of file paths in s3
stepargs.add(jars);
stepargs.add("--properties-file");
//the file we uploaded to the EMR, with its full path
stepargs.add(confFileName);
stepargs.add(jar);
//add the jar specific arguments in here

AddJobFlowStepsResult result = emr.addJobFlowSteps(new AddJobFlowStepsRequest()
    .withJobFlowId(clusterId)
    .withSteps(new StepConfig()
            .withName(name)
            .withActionOnFailure(ActionOnFailure.CONTINUE)
            .withHadoopJarStep(new HadoopJarStepConfig()
                    .withJar("command-runner.jar")
                    .withArgs(stepargs))));

【讨论】:

  • 谢谢,但我正在使用 Lambda 来触发 EMR。我正在使用 boto3 调用来触发 EMR。函数名->client.run_job_flow (boto3.amazonaws.com/v1/documentation/api/latest/reference/…)
  • 您可以触发 EMR,并在 EMR 完成启动过程并等待之后单独添加步骤。两者没有联系,上面显示的代码将步骤添加到预先存在的 EMR。
  • 好的,知道了。应该很有趣。肯定会尝试更新您。感谢您的回复
猜你喜欢
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2016-07-20
  • 2019-05-30
相关资源
最近更新 更多