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



我想在AmazonEMR集群的每个节点上安装一个Python模块。显而易见的方法是ssh到每个节点并在命令行安装它。我认为YARN是在集群中的每个节点上运行相同JAR文件的一种方式,但YARN的"JAR"命令似乎在本地系统上运行。

在启动集群时,您可以使用引导程序在每个EMR节点上安装第三方软件。

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

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的一部分,您可以指定引导操作
  • 每次克隆集群时,这些操作都将被保留,并确保在启动集群时完成引导

创建EMR集群后,这里有一种在所有节点上运行脚本的潜在方法。

yarn node -list 2>/dev/null 
    | sed -n "s/^(ip[^:]*):.*/1/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私钥存在于当前节点上

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

有关更多详细信息,请参阅http://puppetlabs.com

这很难看,但我使用run-if引导操作与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"] 

相关内容

  • 没有找到相关文章

最新更新