我希望能够创建EMR集群,并让这些集群将消息发送回某个中央队列。为了使其工作,我需要在每个主节点上运行某种代理。这些代理中的每一个都必须在此消息中标识自己,以便收件人知道该消息所属的群集。
主节点是否知道其ID(j-*************
)?如果没有,那么是否有其他一些识别信息可以让邮件收件人推断出这个ID?
我已经查看了/home/hadoop/conf
中的配置文件,但我没有找到任何有用的内容。我在/mnt/var/log/instance-controller/instance-controller.log
找到了ID,但看起来很难。我想知道实例控制器可能从哪个位置获取该ID。
答案 0 :(得分:33)
您可以查看主节点上的/mnt/var/lib/info/
以查找有关您的EMR群集设置的大量信息。更具体地说,/mnt/var/lib/info/job-flow.json
包含jobFlowId或ClusterID。
您可以使用预安装的json解析器(jq
)来获取作业流ID。
cat /mnt/var/lib/info/job-flow.json | jq -r ".jobFlowId"
(根据@Marboni更新)
答案 1 :(得分:5)
您可以使用Amazon EC2 API来解决问题。为简单起见,下面的示例使用shell命令。在现实生活中,您应该使用适当的API来执行此步骤。
首先,您应该找到您的实例ID:
INSTANCE=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
然后,您可以使用实例ID找出群集ID:
ec2-describe-instances $INSTANCE | grep TAG | grep aws:elasticmapreduce:job-flow-id
希望这会有所帮助。
答案 2 :(得分:4)
如上所述,信息位于job-flow.json文件中。此文件包含several other attributes。因此,了解它的位置,您可以非常简单地完成它:
cat /mnt/var/lib/info/job-flow.json | grep jobFlowId | cut -f2 -d: | cut -f2 -d'"'
编辑:此命令也适用于核心节点。
答案 3 :(得分:2)
另一个选项 - 查询元数据服务器:
curl -s http://169.254.169.254/2016-09-02/user-data/ | sed -r 's/.*clusterId":"(j-[A-Z0-9]+)",.*/\1/g'
答案 4 :(得分:0)
显然Hadoop MapReduce作业无法知道它正在运行哪个集群 - 我很惊讶自己发现了这个。
但是:您可以为每个地图使用其他标识符来唯一标识正在运行的映射器以及正在运行的作业。
这些是在传递给每个映射器的环境变量中指定的。如果您正在使用Python编写Hadoop流式传输作业,则代码为:
import os
if 'map_input_file' in os.environ:
fileName = os.environ['map_input_file']
if 'mapred_tip_id' in os.environ:
mapper_id = os.environ['mapred_tip_id'].split("_")[-1]
if 'mapred_job_id' in os.environ:
jobID = os.environ['mapred_job_id']
它为您提供:输入文件名,任务ID和作业ID。使用这三个值中的一个或组合,您应该能够唯一地识别正在运行的映射器。
如果您正在寻找特定的工作:“mapred_job_id”可能就是您想要的。