Amazon EMR
Amazon EMR 版本指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

添加 Spark 步骤

您可以使用 Amazon EMR 步骤向安装在 EMR 集群上的 Spark 框架提交工作。有关更多信息,请参阅 Amazon EMR 管理指南 中的步骤。在控制台和 CLI 中,您使用 Spark 应用程序步骤 (代表您将 spark-submit 脚本作为步骤运行) 来完成此操作。借助 API,您通过 spark-submit 使用步骤调用 command-runner.jar

有关向 Spark 提交应用程序的更多信息,请参阅 Apache Spark 文档中的提交应用程序主题。

注意

如果您选择使用客户端部署模式向 Spark 部署工作,您的应用程序文件必须位于 EMR 集群上的本地路径中。当前无法在客户端模式下使用此位置的 Amazon S3 URI。但您可通过集群部署模式使用 S3 URI。

使用控制台提交 Spark 步骤

  1. Open the Amazon EMR console at https://console.amazonaws.cn/elasticmapreduce/.

  2. Cluster List 中,选择您的集群的名称。

  3. 滚动到 Steps 部分并展开它,然后选择 Add step

  4. Add Step 对话框中:

    • 对于 Step type,选择 Spark application

    • 对于 Name,接受默认名称 (Spark application) 或键入新名称。

    • 对于 Deploy mode,选择 ClusterClient 模式。集群模式在集群上启动您的驱动程序 (对于基于 JVM 的程序,此为 main())。而客户端模式本地启动驱动程序。有关更多信息,请参阅 Apache Spark 文档中的集群模式概述

      注意

      集群模式让您能够使用 S3 URI 提交工作。客户端模式要求您将应用程序放到集群主节点的本地文件系统上。

    • 指定所需的 Spark-submit options。有关 spark-submit 选项的更多信息,请参阅使用 spark-submit 启动应用程序

    • 对于 Application location,指定应用程序的本地或 S3 URI 路径。

    • 对于 Arguments,将该字段保留为空白。

    • 对于 Action on failure,接受默认选项 (Continue)。

  5. 选择 Add。步骤会出现在控制台中,其状态为“Pending”。

  6. 步骤的状态会随着步骤的运行从 Pending 变为 Running,再变为 Completed。要更新状态,请选择 Actions 列上方的 Refresh 图标。

  7. 如果您配置了日志记录,则这一步的结果将放在 Amazon EMR 控制台的“Cluster Details”页面上您的步骤旁边的 Log Files 下。在启动集群时,您可以选择在配置的日志存储桶中查找步骤信息。

使用 AWS CLI 向 Spark 提交工作

在创建集群时提交步骤,或使用 aws emr add-steps 子命令在现有集群中提交步骤。

  1. 使用 create-cluster,如以下示例所示。

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    aws emr create-cluster --name "Add Spark Step Cluster" --release-label emr-5.13.0 --applications Name=Spark \ --ec2-attributes KeyName=myKey --instance-type m4.large --instance-count 3 \ --steps Type=Spark,Name="Spark Program",ActionOnFailure=CONTINUE,Args=[--class,org.apache.spark.examples.SparkPi,/usr/lib/spark/lib/spark-examples.jar,10] --use-default-roles

    作为替代方法,您可使用 command-runner.jar,如以下示例所示。

    aws emr create-cluster --name "Add Spark Step Cluster" --release-label emr-5.13.0 \ --applications Name=Spark --ec2-attributes KeyName=myKey --instance-type m4.large --instance-count 3 \ --steps Type=CUSTOM_JAR,Name="Spark Program",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[spark-example,SparkPi,10] --use-default-roles

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

  2. 或者,向正在运行的集群添加步骤。使用 add-steps.

    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/lib/spark-examples.jar,10]

    作为替代方法,您可使用 command-runner.jar,如以下示例所示。

    aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Type=CUSTOM_JAR,Name="Spark Program",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[spark-example,SparkPi,10]

使用 SDK for Java 向 Spark 提交工作

  • 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/lib/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);

您可以通过查看该步骤的日志来了解该步骤的结果。如果您已启用日志记录,则可通过以下方式在 AWS Management Console中执行此操作:选择 Steps,选择您的步骤,然后为 Log files 选择 stdoutstderr。要查看可用日志,请选择 View Logs

覆盖 Spark 默认配置设置

建议您为不同的应用程序覆盖 Spark 默认配置值。您可以在提交应用程序时使用步骤完成此操作 (实质上是向 spark-submit 传递选项)。例如,您可能需要通过更改 spark.executor.memory 来更改为执行者进程分配的内存。您可以为 --executor-memory 开关提供类似下面的参数:

spark-submit --executor-memory 1g --class org.apache.spark.examples.SparkPi /usr/lib/spark/lib/spark-examples.jar 10

同样地,您也可以调节 --executor-cores--driver-memory。在步骤中,您可以向步骤提供以下参数:

--executor-memory 1g --class org.apache.spark.examples.SparkPi /usr/lib/spark/lib/spark-examples.jar 10

您还可以使用 --conf 选项调节没有内置开关的设置。有关可调节的其他设置的更多信息,请参阅 Apache Spark 文档中的动态加载 Spark 属性主题。