我的网络有一些奇怪的(据我所知)DNS服务器导致Hadoop或HBase出现故障。
它将我的主机名解析为我的机器不知道的某个地址(即没有这样的界面)。
如果我在/ etc / hosts中有以下条目,Hadoop会工作:
127.0.0.1 localhost
127.0.1.1 myhostname
如果没有条目“127.0.1.1 myhostname”,则将文件上传到HDFS会失败并抱怨它只能将文件复制到0个数据节点而不是1个。
但是在这种情况下HBase不起作用:从HBase shell创建表会导致NotAllMetaRegionsOnlineException(实际上由HMaster导致尝试绑定到DNS服务器为myhostname返回的错误地址)。
在其他网络中,我使用以下/ etc / hosts:
127.0.0.1 localhost
192.168.1.1 myhostname
Hadoop和HBase都有效。 问题是在第二个网络中,地址是动态的,我无法将其列入/ etc / hosts以覆盖奇怪DNS返回的结果。
Hadoop以伪分布式模式运行。 HBase也可以在单个节点上运行。
不能更改DNS服务器的行为。 在hbase / conf / regionservers中将“localhost”更改为127.0.0.1不会改变任何内容。
有人可以提出一种方法,如何在保留互联网连接的同时覆盖其行为(我实际上是通过Teamviewer在客户端的机器上工作)。或者某种方式配置HBase(或它管理的Zookeeper)不使用主机名来确定要绑定的地址?
答案 0 :(得分:5)
幸运的是,我找到了解决此DNS服务器问题的方法。
当本地主机名查询时,DNS服务器返回了无效地址。 默认情况下,HBase会在本地主机名上反向DNS查找以确定绑定的位置。 由于DNS服务器返回的地址无效,因此HMaster无法绑定。
解决方法: 在hbase / conf / hbase-site.xml中,显式指定将用于master和regionserver的接口:
<configuration>
<property>
<name>hbase.master.dns.interface</name>
<value>lo</value>
</property>
<property>
<name>hbase.regionserver.dns.interface</name>
<value>lo</value>
</property>
</configuration>
在这种情况下,我指定了loopback接口(lo)用于master和regionserver。
答案 1 :(得分:1)
我编写的一个简单工具,用于检查DNS问题: https://github.com/sujee/hadoop-dns-checker