Amazon EMR
Amazon EMR 版本指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

添加 Spark 步骤

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

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

注意

如果您选择使用客户端部署模式向 Spark 部署工作,您的应用程序文件必须位于 EMR 集群上的本地路径中。当前无法在客户端模式下使用此位置的 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.

    aws emr create-cluster --name "Add Spark Step Cluster" --release-label emr-5.4.0 --applications Name=Spark \ --ec2-attributes KeyName=myKey --instance-type m3.xlarge --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.4.0 \ --applications Name=Spark --ec2-attributes KeyName=myKey --instance-type m3.xlarge --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 提交工作

  • 要向集群提交工作,请使用步骤在 EMR 集群上运行 spark-submit 脚本。使用 AmazonElasticMapReduceClient 中的 addJobFlowSteps 方法添加此步骤:

    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 属性主题。