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

时间:2015-12-13 14:13:14

标签: hadoop yarn emr

我想在Amazon EMR集群中的每个节点上安装Python模块。看起来这样做的显而易见的方法是ssh到每个节点并在命令行安装它。我在看YARN是一种在集群中的每个节点上运行相同JAR文件的方法,但YARN" jar"命令似乎在本地系统上运行。

4 个答案:

答案 0 :(得分:3)

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

如果您正在使用命令行,则可以传递作为引导操作的一部分在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的一部分,您可以指定引导操作
  • 每次克隆群集时,都会保留这些操作,并确保在启动群集时完成引导。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在创建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私钥出现在当前节点上

答案 3 :(得分:0)

这非常难看,但是我使用run-if instance.isMaster=trueinstance.isMaster=false的{​​{1}}引导操作在所有节点上运行我的命令:

--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"]