在 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
是 Amazon EMR 集群所在的区域。您可以使用<region>
script-runner.jar
以在集群上运行本地或 Amazon S3 上保存的脚本。当您提交步骤时,您必须指定script-runner.jar
的完整 URI。
提交自定义 JAR 步骤以运行脚本或命令
以下Amazon CLI 示例说明了 Amazon EMR 的 command-runner.jar
和 script-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 cps3://amzn-s3-demo-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://amzn-s3-demo-bucket/my-script.sh
]
其他使用 command-runner.jar
的方法
您还可以借助类似于 spark-submit
或 hadoop-streaming
的工具,使用 command-runner.jar
将工作提交至集群。当您使用 command-runner.jar
启动应用程序时,您指定 CUSTOM_JAR
作为步骤类型而不是使用类似于 SPARK
、STREAMING
或者 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://amzn-s3-demo-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)。 |