gpt4 book ai didi

hadoop - 如何设置 YARN NodeManager 的 nodeID?

转载 作者:可可西里 更新时间:2023-11-01 15:12:17 45 4
gpt4 key购买 nike

我正在尝试借助 Ansible 在 EC2 Spot 实例上设置自定义 Hadoop 基础设施。在这样的实例中,只有内部 IP 是已知的。幸运的是,有一个 ec2.py 脚本可以动态生成 list ,并且可以配置为使用实例的完整外部 DNS 名称作为 inventory_hostname。因此,我将所有 Jinja2 模板设置为使用 inventory_hostname 来设置配置 XML 文件。到目前为止,这对 HDFS 有效,对于 YARN,Nodemanagers 也已注册到 Resource manager。

但是,节点 ID 设置不正确,即设置为它们的内部 IP 地址。

我的 yarn-site.xml.j2 看起来像这样:

<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>

<property>
<name>yarn.resourcemanager.hostname</name>
<value>{{resourcemanager_fqdn}}</value>
</property>

<property>
<name>yarn.resourcemanager.address</name>
<value>{{resourcemanager_fqdn}}:8032</value>
</property>

<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>{{resourcemanager_fqdn}}:8030</value>
</property>

<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>{{resourcemanager_fqdn}}:8088</value>
</property>

<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>{{resourcemanager_fqdn}}:8031</value>
</property>

<property>
<name>yarn.resourcemanager.admin.address</name>
<value>{{resourcemanager_fqdn}}:8033</value>
</property>

<property>
<name>yarn.nodemanager.hostname</name>
<value>{{inventory_hostname}}</value>
</property>

<property>
<name>yarn.nodemanager.address</name>
<value>{{inventory_hostname}}:9999</value>
</property>

<property>
<name>yarn.nodemanager.localizer.address</name>
<value>{{inventory_hostname}}:8040</value>
</property>

<property>
<name>yarn.nodemanager.webapp.address</name>
<value>{{inventory_hostname}}:8042</value>
</property>

<property>
<name>yarn.resourcemanager.bind-host</name>
<value>0.0.0.0</value>
</property>

<property>
<name>yarn.nodemanager.bind-host</name>
<value>0.0.0.0</value>
</property>

</configuration>

其中变量resourcemanager_fqdn是这样获取的:

{{hostvars[groups['tag_hadoop_resourcemanager'][0]].inventory_hostname}}

tag_hadoop_resourcemanagerec2.py 动态生成的主机组。

我以为节点id是从yarn.nodemanager.address派生的,但这似乎被忽略了。仅考虑端口 9999。

这是错误还是我忘记设置附加选项?

最佳答案

我检查了 YARN 代码并发现了以下内容。

有一个函数 buildNodeId(),它构建节点 ID。

Node Id是hostport的组合,设置为host:port

buildNodeId() 在内部调用以下函数来获取 InetAddress:

InetAddress inetAddress = InetAddress.getByName(host);

此调用始终返回内部 IP 地址作为第一个 IP 地址。

让我用一个例子来解释。例如我有以下 IP:

Ethernet: 172.23.206.41 (External IP)
Host-Only: 192.168.56.1 (Internal IP).

让我解释一下这两种情况(内部 vs 外部 IP)

  • 案例 1:默认为内部 IP

    我在 yarn-site.xml 中设置了以下内容:

    <property>
    <name>yarn.nodemanager.address</name>
    <value>mballur:9999</value>
    </property>

    mballur 是我的主机名。

    现在,当我运行 yarn node -list -all 时,我得到如下节点 ID:

    Total Nodes:1
    Node-Id Node-State Node-Http-Address Number-of-Running-Containers
    192.168.56.1:9999 RUNNING 192.168.56.1:50060 0

    节点 ID 是内部 IP + 端口的组合。因为,InetAddress.getByName(host),返回内部 IP 作为第一个 IP 地址。

  • 情况二:显式指定外部IP

    我在 yarn-site.xml 中设置了以下内容:

    <property>
    <name>yarn.nodemanager.address</name>
    <value>172.23.206.41:9999</value>
    </property>

    172.23.206.41 是我的外部 IP。

    现在,当我运行 yarn node -list -all 时,我得到如下节点 ID:

    Total Nodes:1
    Node-Id Node-State Node-Http-Address Number-of-Running-Containers
    172.23.206.41:9999 RUNNING 172.23.206.41:50060 0

    现在,Node ID是“外网IP+端口”的组合。

关于hadoop - 如何设置 YARN NodeManager 的 nodeID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34497451/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com