运行 每个 EMR / Yarn 节点上的 Unix shell 命令

Run a Unix shell command on every EMR / Yarn node

我想在 Amazon EMR 集群中的每个节点上安装一个 Python 模块。看起来最明显的方法是通过 ssh 连接到每个节点并在命令行安装它。我将 YARN 视为在集群中的每个节点上 运行 连接相同 JAR 文件的一种方式,但 YARN 的 "jar" 命令似乎在本地系统上 运行。

您可以在启动集群时使用bootstrap在每个 EMR 节点上安装第 3 方软件。

如果您使用的是命令行,您可以传递作为 bootstrap 操作的一部分保存在 s3 中的 shell 脚本。

aws emr create-cluster --name "Test cluster" --ami-version 3.3 \
--use-default-roles --ec2-attributes KeyName=myKey \
--applications Name=Hue Name=Hive Name=Pig \
--instance-count 5 --instance-type m3.xlarge \
--bootstrap-action Path="s3://elasticmapreduce/bootstrap-actions/download.sh"

如果您使用的是网络界面

  • 创建shell脚本以下载必要的软件
  • 转到 advanced options,作为 General Cluster Settings 的一部分,您可以指定 Bootstrap 操作
  • 每次克隆集群时,这些操作都会被保留,并确保 bootstrap 在启动集群时完成。

YARN 有一个名为 distributed-shell 的代码示例,可以完成您所说的工作。但是它有点重,你可以使用puppet,它可以在集群中安装和配置软件。当然也可以运行unixshell命令或者安装python模块

详情请见http://puppetlabs.com

这很丑陋,但我正在使用一对 run-if bootstrap 动作,instance.isMaster=trueinstance.isMaster=false 到 运行 我对所有命令节点:

--bootstrap-action \
Path=s3://elasticmapreduce/bootstrap-actions/run-if,Args=["instance.isMaster=true","sudo pip install sklearn"] \ 
Path=s3://elasticmapreduce/bootstrap-actions/run-if,Args=["instance.isMaster=false","sudo pip install sklearn"] 

这是 运行 跨所有节点的脚本的一种可能方法 EMR 集群创建之后。

yarn node -list 2>/dev/null \
    | sed -n "s/^\(ip[^:]*\):.*//p" \
    | xargs -t -I{} \
    ssh -i ~/.ssh/yourkey.pem hadoop@{} \
    "pip install package"

关于这里发生的事情的一些说明:

  • yarn node -list 步骤列出所有节点(使用 --states 选项限制此)
  • sed 步骤解析该列表以仅获取节点名称
  • 如果需要,将 -o StrictHostKeyChecking=no 添加到 ssh 以禁用主机密钥检查
  • 如果需要,将 -P n 添加到 xargs 以将其一次限制为 n 个节点
  • 这需要 SSH 私钥存在于当前节点上