【发布时间】:2019-02-04 15:47:31
【问题描述】:
我需要为我的 EMR 集群 (EMR AMI 4.3) 中的所有实例更新 /etc/hosts。
整个脚本无非是:
#!/bin/bash
echo -e 'ip1 uri1' >> /etc/hosts
echo -e 'ip2 uri2' >> /etc/hosts
...
此脚本需要以sudo 运行,否则会失败。
从这里:https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html#bootstrapUses
默认情况下,引导操作以 Hadoop 用户身份执行。您可以使用 sudo 以 root 权限执行引导操作。
好消息...但我不知道该怎么做,也找不到示例。
我尝试了很多东西...包括...
- 作为 Hadoop 运行并向脚本中的每个“echo”语句添加“sudo”
- 使用 shell 脚本复制和 chmod 上述内容(没有 'sudo' 的'echo' 语句)并使用调用
1=1 sudo bash /home/hadoop/myDir/myScript.sh的 run-if 引导程序运行本地副本 - 将整个脚本作为单行代码硬编码到 run-if 引导操作中
我一直得到:
在主实例 (i-xxx) 上,引导操作 2 返回一个非零返回码
如果我检查“设置 hadoop 调试”步骤的日志,那里什么都没有。
总结 emr 设置(按顺序):
- 提供 ec2 实例
- 运行引导操作
- 安装原生应用程序...如 hadoop、spark 等。
所以似乎存在一些风险,因为我在安装 hadoop 之前作为用户 Hadoop 到处乱逛,我可能会在那里搞砸一些东西,但我无法想象会发生什么。
我认为这一定是我的脚本没有以“sudo”运行,并且无法更新/etc/hosts。
我的问题...如何在 EMR 上使用引导操作(或其他东西)以 sudo 运行简单的 shell 脚本? ...专门更新/etc/hosts?
【问题讨论】:
-
在 EMR 引导操作中使用 sudo 没有问题。如果你启动一个集群,然后通过 SSH 作为 hadoop 进入其中一个节点,你可以 sudo 吗?您可以尝试使用执行 cat /etc/hosts 的琐碎 BA,然后 sudo cat /etc/hosts 使用 echo "I'm now about to do X" 来调试进度。
-
如果我 ssh 进入,以 'sudo' 运行命令是没有问题的。我会像你建议的那样运行一些简单的例子,看看我是否可以在集群不因引导错误而终止的情况下运行它们,这样我就可以查看结果。一个问题......你说“我在 EMR 引导操作中使用 sudo 没有遇到问题。”你的意思是你在shell脚本中使用了'sudo',并且脚本默认运行正常(作为用户Hadoop)?
-
正确,shell 脚本作为 BA 运行,其中 shell 脚本为某些命令调用 sudo。
-
按照你的建议做了。
cat /etc/hosts和sudo cat /etc/hosts和 echo 都运行良好,输出在 /mnt/var/log/bootstrap-actions/1 中用于主控和执行器。但是,在现有集群上,作为 Hadoop... 尝试使用sudo echo -e 'ip1 uri1' >> /etc/hosts运行 shell 脚本,并且在作为 sudo 运行时运行正常,但在作为 hadoop 运行时失败,并显示错误消息/etc/hosts: Permission denied -
试试:sudo sh -c 'echo -e "ip1 uri1" >> /etc/hosts'
标签: amazon-web-services hadoop sudo amazon-emr