Hbase:如何为Hbase主服务器指定主机名

时间:2012-03-08 09:56:03

标签: hadoop hbase

我正在努力设置一个带有2个节点的Hbase分布式集群,一个是我的机器,一个是VM,使用VirtualBox中的“仅主机”适配器。

我的问题是区域服务器(来自VM机器)无法连接到在主机上运行的Hbase主服务器。虽然在Hbase shell中我可以列出,创建表,...,在VM机器上的regionserver('slave'),日志总是显示

org.apache.hadoop.hbase.regionserver.HRegionServer: Unable to connect to master.      Retrying. Error was:
java.net.ConnectException: Connection refused

以前,我已成功在此群集上设置Hadoop,HDFS和MapReduce,其中2个节点名为“master”,“slave”,“master”作为主节点,“master”和“slave”都作为slave工作节点,这些名称绑定到VirtualBox的vboxnet0接口(/ etc / hostname中的主机名不同)。我还要为每个节点指定“slave.host.name”属性为“master”和“slave”。

似乎'master'上的Hbase master始终使用'localhost'主机名运行,从slave机器,我无法使用'master'主机名telnet到hbase master。那么有没有办法指定Hbase master的主机名用作'master',我试过为ZooKeeper,Master,RegionServer指定一些关于DNS接口的属性来使用master和slave之间的内部接口,但它仍然无法正常工作

这样的

/ etc / hosts

127.0.0.1   localhost
127.0.0.1   ubuntu.mymachine

# For Hadoop
192.168.56.1 master
192.168.56.101 slave

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

4 个答案:

答案 0 :(得分:3)

@Infinity提供的答案似乎属于版本~0.9.4。

对于版本1.1.4。

根据

的源代码
org.apache.hadoop.hbase.master.HMaster

配置应该是:

  <property>
    <name>hbase.master.hostname</name>
    <value>master.local</value>
    <!-- master.local is the DNS name in my network pointing to hbase master -->
  </property>

设置此值后,区域服务器可以连接到hbase master; 但是,在我的环境中,区域服务器抱怨:

com.google.protobuf.ServiceException: java.net.SocketException: Invalid argument

在我的所有节点中安装oracle JDK 8而不是open-jdk-7后,问题就消失了。

总而言之,这是我的解决方案:

  • 使用dns名称服务器而不是设置/ etc / hosts,因为hbase非常 挑剔主机名,似乎需要DNS查找以及反向 DNS查找。

  • 将jdk升级到oracle 8

  • 使用提到的设置项目 上方。

答案 1 :(得分:2)

我的主机文件就像

127.0.0.1 localhost

192.168.2.118 shashwat.machine.com shashwat

使您的主机文件如下:

127.0.0.1 localhost

对于Hadoop

192.168.56.1 master

192.168.56.101奴隶

并在hbase conf中添加以下条目:

<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.master</name>
<value>master:60000</value>
<description>The host and port that the HBase master runs at.</description>
</property>
<property>
<name>hbase.regionserver.port</name>
<value>60020</value>
<description>The host and port that the HBase master runs at.</description>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/home/cluster/Hadoop/hbase-0.90.4/temp</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
<description>Property from ZooKeeper's config zoo.cfg.
The port at which the clients will connect.
</description>
</property>

如果您在任何地方使用localhost,请删除它并将其替换为“master”,这是您的主机文件中namenode的名称....

你可以做的更多事情

sudo gedit / etc / hostname

这将通过默认打开主机名文件ubuntu将在那里使其成为主人。并重新启动您的系统。

对于hbase,在conf目录中的“regionserver”文件中指定这些条目

主 从属

并重新启动。

答案 2 :(得分:0)

我有两件事可以解决这类问题:

1)删除所有“localhost”名称,只有127.0.0.1指向hmaster节点的名称。

2)在hbase主节点上运行“hostname X”,以确保主机名与/ etc / hosts中的主机名匹配。

不是网络专家,我不能说为什么这很重要,但它是:)

答案 3 :(得分:0)

大多数情况下,错误来自发送错误主机名的Zookeeper。

您可以检查Zookeeper作为HBase主机发送的内容:

查找Zookeeper bin文件夹:

bin/zkCli.sh -server 127.0.0.1:2181
get /hbase/master

这应该为您提供回答Zookeeper的HBase主IP,因此必须可以访问此IP。