在 Amazon EMR 集群上运行命令和脚本 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在 Amazon EMR 集群上运行命令和脚本

本主题介绍如何作为步骤在集群上运行命令或脚本。作为步骤运行命令或脚本是将工作提交到集群的其中一种方式,在以下情况下非常有用:

  • 当您未允许 SSH 访问您的 Amazon EMR 集群时

  • 当你想运行 bash 或 shell 命令来排除集群故障时

您可以在创建集群时或者在集群处于 WAITING 状态时运行脚本。要在步骤处理开始前运行脚本,您可使用引导操作。有关引导操作更多信息,请参阅《Amazon EMR 管理指南》中的创建引导操作以安装其它软件

Amazon EMR 提供以下工具来帮助您运行脚本、命令和其他集群上的程序。您可以使用 Amazon EMR 管理控制台或 Amazon CLI 调用所有工具。

command-runner.jar

位于集群的 Amazon EMR AMI 上。您可以使用 command-runner.jar 在集群上运行命令。你没有使用其完整路径指定 command-runner.jar

script-runner.jar

Amazon S3 托管在 s3://<region>.elasticmapreduce/libs/script-runner/script-runner.jar,其中 <region> 是 Amazon EMR 集群所在的区域。您可以使用 script-runner.jar 以在集群上运行本地或 Amazon S3 上保存的脚本。当您提交步骤时,您必须指定 script-runner.jar 的完整 URI。

提交自定义 JAR 步骤以运行脚本或命令

以下Amazon CLI 示例说明了 Amazon EMR 的 command-runner.jarscript-runner.jar 一些常见使用场景。

例 :使用 command-runner.jar 在集群上运行命令

当您使用 command-runner.jar时,您可以在步骤的参数列表中指定命令、选项和值。

以下 Amazon CLI 示例将步骤提交至调用 command-runner.jar 的运行中的集群。Args 列表指定的命令下载名为my-script.sh的脚本,下载方式是从 Amazon S3 进入 hadoop 用户主目录。然后,该命令修改脚本权限并运行my-script.sh

当您使用 Amazon CLI时,Args 列表中的项目应该用逗号分隔开来,列表元素之间没有空格。例如,使用 Args=[example-command,example-option,"example option value"] 而不是 Args=[example-command, example-option, "example option value"]

aws emr add-steps \ --cluster-id j-2AXXXXXXGAPLF \ --steps Type=CUSTOM_JAR,Name="Download a script from S3, change its permissions, and run it",ActionOnFailure=CONTINUE,Jar=command-runner.jar,Args=[bash,-c,"aws s3 cp s3://EXAMPLE-DOC-BUCKET/my-script.sh /home/hadoop; chmod u+x /home/hadoop/my-script.sh; cd /home/hadoop; ./my-script.sh"]
例 :使用 script-runner.jar在集群上运行脚本

当您使用 script-runner.jar时,在步骤的参数列表中指定想要运行的脚本。

以下 Amazon CLI 示例将步骤提交至调用 script-runner.jar 的运行中的集群。在此情况下,称为 my-script.sh 的脚本存储在 Amazon S3。您还可以指定存储在集群主节点 (master node) 的本地脚本。

aws emr add-steps \ --cluster-id j-2AXXXXXXGAPLF \ --steps Type=CUSTOM_JAR,Name="Run a script from S3 with script-runner.jar",ActionOnFailure=CONTINUE,Jar=s3://us-west-2.elasticmapreduce/libs/script-runner/script-runner.jar,Args=[s3://EXAMPLE-DOC-BUCKET/my-script.sh]

其他使用 command-runner.jar 的方法

您还可以借助类似于 spark-submithadoop-streaming 的工具,使用 command-runner.jar 将工作提交至集群。当您使用 command-runner.jar 启动应用程序时,您指定 CUSTOM_JAR 作为步骤类型而不是使用类似于 SPARKSTREAMING 或者 PIG 的值。工具可用性取决于您在集群上安装的应用程序。

以下示例命令借助 spark-submit 使用command-runner.jar 提交步骤。Args 列表指定 spark-submit 作为命令,接着是附加参数和值的 Spark 应用程序 my-app.py Amazon S3 URI。

aws emr add-steps \ --cluster-id j-2AXXXXXXGAPLF \ --steps Type=CUSTOM_JAR,Name="Run spark-submit using command-runner.jar",ActionOnFailure=CONTINUE,Jar=command-runner.jar,Args=[spark-submit,S3://DOC-EXAMPLE-BUCKET/my-app.py,ArgName1,ArgValue1,ArgName2,ArgValue2]

下表列出了通过 command-runner.jar 您可以使用的其他工具。

工具名称 描述
hadoop-streaming 提交 Hadoop 流式处理程序。在控制台和一些开发工具包中,这是流步骤。
hive-script 运行 Hive 脚本。在控制台和开发工具包中,这是 Hive 步骤。
pig-script 运行 Pig 脚本。在控制台和开发工具包中,这是 Pig 步骤。
spark-submit

运行 Spark 应用程序。在控制台中,这是 Spark 步骤。

hadoop-lzo 在目录上运行 Hadoop LZO 索引器
s3-dist-cp 将大量数据从 Amazon S3 分布式复制到 HDFS。有关更多信息,请参阅S3DistCp (s3-dist-cp)