1

我的网络带有一些奇怪的(据我所知)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)不使用主机名来确定要绑定的地址?

4

2 回答 2

5

幸运的是,我找到了解决此 DNS 服务器问题的方法。

本地主机名查询时 DNS 服务器返回无效地址。默认情况下,HBase 会对本地主机名进行反向 DNS 查找以确定绑定位置。由于DNS服务器返回的地址无效,HMaster无法绑定。

解决方法:在 hbase/conf/hbase-site.xml 中明确指定将用于主服务器和区域服务器的接口:

<configuration>
  <property>
    <name>hbase.master.dns.interface</name>
    <value>lo</value>
  </property>
  <property>
    <name>hbase.regionserver.dns.interface</name>
    <value>lo</value>
  </property>
</configuration>

在这种情况下,我指定了用于主服务器和区域服务器的环回接口 (lo)。

于 2011-10-29T22:31:33.033 回答
1

我为检查 DNS 问题而编写的一个简单工具: https ://github.com/sujee/hadoop-dns-checker

于 2012-07-26T19:11:02.597 回答