Amazon web services EMR主节点是否知道其群集ID?

Amazon web services EMR主节点是否知道其群集ID?,amazon-web-services,hadoop,amazon-emr,Amazon Web Services,Hadoop,Amazon Emr,我希望能够创建EMR集群,并让这些集群将消息发送回某个中央队列。为了让它工作,我需要在每个主节点上运行某种代理。这些代理中的每一个都必须在该消息中标识自己,以便接收者知道该消息是关于哪个集群的 主节点是否知道其ID(j-***************)?如果没有,那么是否有其他一些标识信息可以让邮件收件人推断出该ID 我查看了/home/hadoop/conf中的配置文件,没有发现任何有用的内容。我在/mnt/var/log/instance controller/instance contro

我希望能够创建EMR集群,并让这些集群将消息发送回某个中央队列。为了让它工作,我需要在每个主节点上运行某种代理。这些代理中的每一个都必须在该消息中标识自己,以便接收者知道该消息是关于哪个集群的

主节点是否知道其ID(
j-***************
)?如果没有,那么是否有其他一些标识信息可以让邮件收件人推断出该ID


我查看了
/home/hadoop/conf
中的配置文件,没有发现任何有用的内容。我在
/mnt/var/log/instance controller/instance controller.log
中找到了该ID,但看起来很难找到它。我想知道instance controller首先从哪里获得该ID。

显然,Hadoop MapReduce作业无法知道它运行在哪个集群上——我自己也很惊讶地发现了这一点

但是:您可以为每个映射使用其他标识符来唯一标识正在运行的映射程序和正在运行的作业

这些在传递给每个映射器的环境变量中指定。如果您正在使用Python在Hadoop streaming中编写作业,代码如下:

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\u job\u id”可能就是您想要的。

您可以使用AmazonEC2API来解决这个问题。为了简单起见,下面的示例使用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

希望这有帮助

您可以查看主节点上的
/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更新)

如上所述,信息位于job-flow.json文件中。此文件已被删除。因此,知道它位于何处,您可以用一种非常简单的方式来完成:

cat /mnt/var/lib/info/job-flow.json | grep jobFlowId | cut -f2 -d: | cut -f2 -d'"'

编辑:此命令也适用于核心节点。

另一个选项-查询元数据服务器:

curl -s http://169.254.169.254/2016-09-02/user-data/ | sed -r 's/.*clusterId":"(j-[A-Z0-9]+)",.*/\1/g'

第一个查询在没有任何特殊权限的情况下是可行的。我假设第二个需要执行EC2操作的能力,是吗?对我来说不起作用,在第二个命令“Client.InvalidInstanceID.NotFound:实例ID'xxxx'不存在(服务:AmazonEC2;状态代码:400;错误代码:InvalidInstanceID.NotFound;请求ID:xxxx-xxxx)”中出错。对我来说很好。你确定你使用的是正确的AWS访问密钥吗?如果其他人对该IP有所警惕,它是一个用于向EC2实例分发元信息的IP。@spats你可能只需要指定实例正在运行的区域:
EC2 descripe instances--region$instance
Awesome,我来检查一下!请参阅@jcmannem此文件夹包含我需要的所有内容。甚至,它也避免了AWS节流API。我使用的文件名-/mnt/var/lib/info/job-flow-state.txt现在的问题是,我如何解析这个文件?你知道吗?如果是,我可以使用jackson library。@devsda您可以使用预先安装的jq解析文件:
cat/mnt/var/lib/info/job-flow.json | jq-r“.jobFlowId”
此文件夹包含我需要的所有内容。甚至,它也避免了AWS节流API。我使用的文件名-/mnt/var/lib/info/job-flow-state.txt现在的问题是,我如何解析这个文件?你知道吗?如果是的话,我可以使用jackson库。我不知道该文件的内容,所以我不知道如何解析它,也许你应该再问一个问题;)0否决票是否可以从spark应用程序读取job-flow.json?进程p=Runtime.getRuntime().exec(“cat/mnt/var/lib/info/job-flow.json | grep-jobFlowId | cut-f2-d:”);我试过了,但流程输入流似乎没有返回任何结果。谢谢