【问题标题】:AWS EMR bootstrap action as sudoAWS EMR 引导操作作为 sudo
【发布时间】: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 调试”步骤的日志,那里什么都没有。

从这里:https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-overview.html#emr-overview-cluster-lifecycle

总结 emr 设置(按顺序):

  1. 提供 ec2 实例
  2. 运行引导操作
  3. 安装原生应用程序...如 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/hostssudo 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


【解决方案1】:

在作为 EMR 引导操作运行的 shell 脚本中使用 sudo 没有问题,因此它应该可以工作。您可以使用一个简单的脚本来测试它是否可以使用“sudo ls /root”。

您的脚本正在尝试通过重定向标准输出来附加到 /etc/hosts:

sudo echo -e 'ip1 uri1' >> /etc/hosts

这里的问题是,当使用 sudo 运行 echo 时,重定向 (>>) 不是。它由底层 hadoop 用户运行,该用户无权写入 /etc/hosts。解决方法是:

sudo sh -c 'echo -e "ip1 uri1" >> /etc/hosts'

这会在带有 sudo 的 shell 中运行整个命令,包括标准输出重定向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2015-01-02
    • 2019-10-25
    相关资源
    最近更新 更多