2012-03-08 100 views
7

我正在努力使用VirtualBox中的“主机专用”适配器来设置具有2个节点的Hbase分布式集群,其中一个是我的机器,另一个是VM。Hbase:如何指定Hbase主机的主机名

我的问题是区域服务器(来自VM机器)无法连接到在主机上运行的Hbase主机。虽然在HBase的壳,我可以列出,VM机(“奴隶”),日志总是显示

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

此前在创建表,...,在RegionServer的,我成功地已经设置的Hadoop,HDFS和MapReduce上这个集群有2个节点,分别命名为'master','slave','master'作为主节点,'master'和'slave'都作为从节点,这些名称绑定到VirtualBox的vboxnet0接口(主机名在/ etc/hostname不同)。我还将每个节点的“slave.host.name”属性指定为“主”和“从属”。

看起来,'master'上的Hbase master始终以'localhost'主机名从slave机器运行,我无法通过'master'主机名telnet到hbase master。那么是否有任何方法可以将Hbase master的主机名用作'master',我已经试过指定一些关于ZooKeeper,Master,RegionServer的DNS接口的属性来使用主从设备之间的内部接口,但它仍然不能工作。

的/ etc /两种,就像这样

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 

回答

2

我的主机文件的主机就像

127.0.0.1本地主机

192.168.2.118 shashwat.machine.com shashwat

使您的主机文件如下:

127.0.0.1本地主机

Hadoop的

192.168.56.1主

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和ywhere删除,并以 “主人”,这是名称为您HOSTFILE的NameNode ....

一个更换morething你可以做

须藤gedit中的/ etc /主机名

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

对于HBase的在 “RegionServer的” 文件中指定内部的conf目录把这些条目

主 从

和restart.everything。

+0

很好的回答。一个新的查询,是否可以在不编辑'hosts'文件的情况下创建一个HBase集群? (我特意指窗口中) – 2015-01-21 06:46:29

0

有迹象表明,解决这一类问题对我来说两件事情:

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

2)运行“主机X”您的HBase的主节点,以确保主机名匹配什么是在/ etc/hosts中。

并非是一个网络高手,我不能说,为什么这很重要,但它是:)

0

大部分时间误差是从动物园管理员说发送错误的主机名来。

你可以查阅一下动物园管理员将作为HBase的主服务器主机:

找到动物园管理员bin文件夹:

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

这应该给你HBase的主IP这个问题的答案动物园管理员,所以这个IP必须是可访问的。

2

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

For version 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; 然而,在我的环境中,区域服务器抱怨:在我安装在我所有的节点甲骨文JDK 8,而不是开放式的jdk-7的

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

问题就消失了。

所以在最后,这里是我的解决方案:

  • 使用DNS名称服务器,而不是设置/ etc/hosts文件,如HBase的是主机名非常 挑剔,似乎需要DNS查找以及反向 DNS查找。

  • 升级JDK到Oracle 8

  • 使用的设定项目上述 。