emr主节点知道它的集群id吗?

qc6wkl3g  于 2021-05-29  发布在  Hadoop
关注(0)|答案(5)|浏览(373)

我希望能够创建emr集群,并让这些集群将消息发送回某个中心队列。为了让它工作,我需要在每个主节点上运行某种代理。这些代理中的每一个都必须在该消息中标识自己,以便收件人知道该消息是关于哪个集群的。
主节点是否知道其id( j-************* )? 如果没有,那么是否还有其他一些标识信息可以让消息接收者推断出这个id?
我查看了中的配置文件 /home/hadoop/conf ,但我没有发现任何有用的东西。我在里面找到了身份证 /mnt/var/log/instance-controller/instance-controller.log ,但看起来很难预测。我想知道示例控制器首先从哪里得到这个id。

xqkwcwgp

xqkwcwgp1#

如上所述,信息在job-flow.json文件中。此文件还有其他几个属性。所以,知道它的位置,你可以用一种非常简单的方法:

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

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

hs1rzwqc

hs1rzwqc2#

你可以看看 /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更新)

mbskvtky

mbskvtky3#

显然hadoopmapreduce作业无法知道它在哪个集群上运行——我自己也很惊讶地发现了这一点。
但是:您可以为每个Map使用其他标识符来唯一地标识正在运行的Map程序和正在运行的作业。
这些是在传递给每个Map器的环境变量中指定的。如果您使用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。使用这三个值中的一个或组合,您应该能够唯一地标识正在运行的Map程序。
如果你正在寻找一个特定的工作:“mapred\u job\u id”可能是你想要的。

tktrz96b

tktrz96b4#

您可以使用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

希望这有帮助。

y3bcpkx1

y3bcpkx15#

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

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

相关问题