Java Hadoop Datanode在错误的接口上启动
我们为hadoop集群使用了2个接口。私人eth-1和公共。看起来当hadoop datanode启动时,它会选择公共IP地址而不是私有IP地址。当我查看hadoop-cmf-hdfs-DATANODE-hostname.log.out时,它会显示出来Java Hadoop Datanode在错误的接口上启动,java,hadoop,mapreduce,cloudera,network-interface,Java,Hadoop,Mapreduce,Cloudera,Network Interface,我们为hadoop集群使用了2个接口。私人eth-1和公共。看起来当hadoop datanode启动时,它会选择公共IP地址而不是私有IP地址。当我查看hadoop-cmf-hdfs-DATANODE-hostname.log.out时,它会显示出来 STARTUP_MSG: Starting DataNode STARTUP_MSG: host = hostname.public.net/208.x.x.x 它应该说什么呢 STARTUP_MSG: Starting DataNode
STARTUP_MSG: Starting DataNode
STARTUP_MSG: host = hostname.public.net/208.x.x.x
它应该说什么呢
STARTUP_MSG: Starting DataNode
STARTUP_MSG: host = hostname-eth1.private.net/192.168.x.x
hdfs-site.xml中有一个设置,可以控制接口,该接口被数据节点用作其IP地址 dfs.datanode.dns.interface=数据节点应报告其IP地址的网络接口的名称。 这被设置为“默认”。如果要使用eth1,请在hdfs-site.xml中将此属性设置为:
<property>
<name>dfs.datanode.dns.interface</name>
<value>eth1</value>
</property>
dfs.datanode.dns.interface
eth1
引用“Hadoop最终指南”一书:
还有一个设置,用于控制数据节点将哪些网络接口用作其IP地址(对于HTTP和RPC服务器)。相关财产为:
dfs.datanode.dns.interface,设置为默认以使用默认网络
接口。您可以显式设置该属性以报告特定接口(例如eth0)的地址。
您可以尝试引用该属性吗?(连接到其他数据节点进行数据传输时,datanodes是否应使用datanode主机名。)
dfs.datanode.use.datanode.hostname
真的
在以下情况下datanodes是否应使用datanode主机名:
连接到其他数据节点以进行数据传输。
根据检查其他datanode属性,如dfs.datanode.address,您可以找到解决方案
还有一件事:检查主机文件中的IP/域名映射。谢谢,但该行使用反向dns查询将主机名绑定到该eth1接口上的IP地址。不幸的是,我没有反向dns。是否有地方可以插入完全限定的主机名-eth1,这样它就不会查找反向dns?还有一个设置:“dfs.namenode.datanode.registration.ip主机名检查”。请参见此处此设置的描述:运气不佳。在/var/logs/hadoop hdfs上,它绑定了错误的主机名
org.apache.hadoop.hdfs.server.datanode.BlockScanner:使用targetBytesPerSec 1048576初始化了块扫描程序2015-10-20 18:47:08408 INFO org.apache.hadoop.hdfs.server.datanode.datanode:启用了文件描述符传递。2015-10-20 18:47:08409 INFO org.apache.hadoop.hdfs.server.datanode.datanode:配置的主机名是hostname.public.net
最后一行必须是org.apache.hadoop.hdfs.server.datanode.datanode:配置的主机名是hostname-eth1.private.net
我检查了hadoop代码。获取主机名时,它调用函数DNS.getDefaultHost(),该函数接受两个参数:interface和nameserver。要设置名称服务器,您需要再设置一个参数:“dfs.datanode.dns.nameserver”。这也可以保留为“默认”值。
<property>
<name>dfs.datanode.use.datanode.hostname</name>
<value>true</value>
<description>Whether datanodes should use datanode hostnames when
connecting to other datanodes for data transfer.
</description>
</property>