我正在努力设置一个带有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
答案 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
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。