2012-01-25 58 views
3

我有HBase & HDFS设置和工作在伪分布式模式(在Mac OSX上)。我也有一个简单的Java应用程序。它在本地使用时有效。 我想让它远程工作。服务器隐藏在路由器后面,所有必要的端口都被转发。hbase伪分布式远程连接

当我尝试远程连接,我得到:

... 
12/01/25 23:21:15 INFO zookeeper.ClientCnxn: Session establishment complete on server 
remote.host.com/remoteip:53058, sessionid = 0x13516f179a30005, negotiated timeout = 40000 
12/01/25 23:21:36 INFO client.HConnectionManager$HConnectionImplementation: getMaster attempt 
0 of 10 failed; retrying after sleep of 1000 
java.net.SocketTimeoutException: 20000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=192.168.52.53/192.168.52.53:58023] 

这对我来说意味着动物园管理员连接,但给客户端的错误地址: 1),因为它的本地 2),因为它在错误的端口上

我试图通过在HDFS core-site.xml(fs.default.name)和hbase-site.xml(hbase.rootdir)中设置远程地址来解决问题#1。 HDFS不会绑定到远程地址。如果HDFS绑定到本地并运行,如果hbase站点中的远程站点被授予hbase,则hbase将不会连接(ip和端口转发可以正常工作,并通过telnet进行检查)。 我用/ etc/hosts玩过 - 无论是否ping -c 1 $(hostname)返回本地或远程地址,都是HBFS仅在启动绑定到本地时启动的HDFS &。

我还尝试通过在hbase-site.xml中设置hbase.master.port来修复问题#2 - 无关紧要,HBase主服务器绑定到随机端口。

我已经浪费了大量的时间试图做到这一点,检查了所有可能的来源,并尝试了所有可能的组合。

+0

为了让我们正确理解拓扑结构,请更正它出错的地方:您的工作站上有一个Java应用程序,您正尝试通过路由器连接到远程网络上的HBase安装。 –

+0

正确。我在这里错过了什么吗?我正在使用Clouderas最新版本。 –

回答

1

这种情况下的常见问题是您期望您可以通过NAT防火墙外部的单个IP地址访问HBase。虽然这可能是可能的,但它很难建立,几乎肯定不受支持。

当客户端连接到HBase时,会发生的第一件事是他们连接到ZooKeeper以确定哪台机器承载他们正在查找的表(或者如果您正在执行管理操作,哪台机器是当前的主机)似乎是这种情况)。

然后客户端直接连接到远程机器。如果远程计算机(特别是HBase RegionServers)位于NAT路由器之后并使用其内部IP向ZooKeeper报告自身,那么路由器之外的计算机无法解析防火墙内部的RegionServer的IP。

通过NAT使HBase工作的唯一合理方法是通过代理引导所有外部请求。有两种选择--Thrift和REST。代码如下:http://ofps.oreilly.com/titles/9781449396107/clients.html

顺便提一句,你几乎不需要这个设置 - 所有的客户机都应该能够直接与RegionServers通信,这样你就不会在HBase代理服务器上出现瓶颈。

+1

谢谢你的帮助。我的用例相当独特,这就是为什么我需要这样的功能。将继续使用REST。 –

+0

我有同样的问题,你能告诉我解决这个问题的步骤。 –