本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
早期AMI版本的 Amazon 的 Spark 应用程序细节 EMR
以交互方式或批处理模式使用 Spark
Amazon EMR 允许您在两种模式下运行 Spark 应用程序:
-
交互式
-
批处理
使用控制台或启动长时间运行的集群时 AWS CLI,您可以以 Hadoop 用户身份使用SSH连接到主节点,并使用 Spark 外壳以交互方式开发和运行 Spark 应用程序。与批处理环境相比,以交互方式使用 Spark 能够让您更轻松地对 Spark 应用程序进行原型设计或测试。在交互模式下成功修改 Spark 应用程序后,您可以将该应用程序JAR或 Python 程序放入 Amazon S3 上集群主节点本地的文件系统中。然后,您可以将应用程序作为批处理工作流程提交。
在批处理模式中,将 Spark 脚本上传到 Amazon S3 或本地主节点文件系统,然后将此工作作为步骤提交到集群。Spark 步骤可提交到长时间运行的集群或暂时性集群。
创建安装了 Spark 的集群
使用控制台启动安装了 Spark 的集群
导航到新的 Amazon EMR 控制台,然后从侧面导航栏中选择 “切换到旧主机”。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console。
-
选择创建集群。
-
在 “软件配置” 中,选择所需的AMI发行版本。
-
对于 Applications to be installed (要安装的应用程序),从列表中选择 Spark,然后选择 Configure and add (配置并添加)。
-
添加参数以按需更改 Spark 配置。有关更多信息,请参阅 配置 Spark。选择 添加。
-
根据需要选择其它选项,然后选择 Create cluster (创建集群)。
以下示例演示如何使用 Java 创建带 Spark 的集群:
AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials); SupportedProductConfig sparkConfig = new SupportedProductConfig() .withName("Spark"); RunJobFlowRequest request = new RunJobFlowRequest() .withName("Spark Cluster") .withAmiVersion("3.11.0") .withNewSupportedProducts(sparkConfig) .withInstances(new JobFlowInstancesConfig() .withEc2KeyName("
myKeyName
") .withInstanceCount(1) .withKeepJobFlowAliveWhenNoSteps(true) .withMasterInstanceType("m3.xlarge") .withSlaveInstanceType("m3.xlarge") ); RunJobFlowResult result = emr.runJobFlow(request);
配置 Spark
您可以在创建集群时通过运行位于 Github awslabs/emr-bootstrap-actions/spark 存储库$SPARK_CONF_DIR/spark-defaults.conf
文件中的属性。有关设置的更多信息,请参阅 Spark 文档中的 Spark 配置主题。例如,您可以将以下内容URL中的 “最新” 替换为要安装的 Spark 版本号2.2.0
http://spark.apache.org/docs/latest/configuration.html
您也可以在每次提交应用程序时动态配置 Spark。使用 spark
配置文件提供了便于执行程序自动充分利用资源分配的设置。有关更多信息,请参阅 覆盖 Spark 默认配置设置。
更改 Spark 默认设置
以下示例演示如何使用 AWS CLI创建 spark.executor.memory
设置为 2G 的集群。
注意
为了便于读取,包含 Linux 行继续符(\)。它们可以通过 Linux 命令删除或使用。对于 Windows,请将它们删除或替换为脱字号(^)。
aws emr create-cluster --name "Spark cluster" --ami-version
3.11.0
\ --applications Name=Spark, Args=[-d,spark.executor.memory=2G] --ec2-attributes KeyName=myKey \ --instance-type m3.xlarge --instance-count 3 --use-default-roles
向 Spark 提交工作
要向集群提交工作,请使用步骤在EMR集群上运行spark-submit
脚本。使用中的addJobFlowSteps
方法添加步骤 AmazonElasticMapReduceClient:
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials); StepFactory stepFactory = new StepFactory(); AddJobFlowStepsRequest req = new AddJobFlowStepsRequest(); req.withJobFlowId("j-
1K48XXXXXXHCB
"); List<StepConfig> stepConfigs = new ArrayList<StepConfig>(); StepConfig sparkStep = new StepConfig() .withName("Spark Step") .withActionOnFailure("CONTINUE") .withHadoopJarStep(stepFactory.newScriptRunnerStep("/home/hadoop/spark/bin/spark-submit","--class","org.apache.spark.examples.SparkPi","/home/hadoop/spark/lib/spark-examples-1.3.1-hadoop2.4.0.jar","10")); stepConfigs.add(sparkStep); req.withSteps(stepConfigs); AddJobFlowStepsResult result = emr.addJobFlowSteps(req);
覆盖 Spark 默认配置设置
建议您为不同的应用程序覆盖 Spark 默认配置值。您可以在提交应用程序时使用步骤完成此操作 (实质上是向 spark-submit
传递选项)。例如,您可能需要通过更改 spark.executor.memory
来更改为执行者进程分配的内存。您可以为 --executor-memory
开关提供与下类似的参数:
/home/hadoop/spark/bin/spark-submit --executor-memory 1g --class org.apache.spark.examples.SparkPi /home/hadoop/spark/lib/spark-examples*.jar 10
同样地,您也可以调节 --executor-cores
和 --driver-memory
。在步骤中,您可以向步骤提供以下参数:
--executor-memory 1g --class org.apache.spark.examples.SparkPi /home/hadoop/spark/lib/spark-examples*.jar 10
您还可以使用 --conf
选项调节没有内置开关的设置。有关可调节的其他设置的更多信息,请参阅 Apache Spark 文档中的动态加载 Spark 属性