Windwos下连远程linux Hbase小问题
前几天,兴起想仔细玩玩hbase,细细去研究一下,写了个小demo,从win7去连接另一台T510的ubuntu上的hbase.很简单的crud的操作程序,没有看出来什么问题,但是跑起来,硬是好像block住了,不往下执行,eclipse
console没有打印任何信息,小红点还一直亮,纳闷之余,看到一些
Opening socket connection to server
192.168.0.xx/192.168.0.xx:2181. Will not attempt to authenticate using SASL
(java.lang.SecurityException: 无法定位登录配置) 错误及 hadoop.native.lib is deprecated.
Instead, use
io.native.lib.available错误,以为是这二者造成的,网上找了n个贴子,试了n次,都毫无头绪,结果还是依然....
真是奇怪了,zookeeper都连上了,但连不到Hbase的master或region server. why?
换了一个本地虚拟机上的单节点伪分布下的hadoop,架上一个hbase-0.98.1-hadoop2跑起,win7下eclipse插件连接hdfs没问题,刷刷的/hbase目录出现了,hbase-site.xml配置好hbase.zookeeper.quorum指向新vm的本地域名,跑起,通了,刷刷的几秒执行完。。怪事,以后实例就直接vm上玩了。。。。
今天下血本败了台新笔记本,内存升到了16G,装了ubuntu server,把hadoop2,hbase,hive一通都配好,再将quorum指向此机子下的地址,之前的那个问题又来了。小红点一直没退,block住一动不动。奇怪奇怪。。。。
决定debug跟踪一看究竟。。。。
一路都跟着很正常,很轻易地连上了zookeeper,locateMeta地址,locate
master的location,再到生成RPC的stub完全ok...但是并不是所有都ok....当执行到
RpcRetryingCaller.callWithRetries时,block住了,等了十几秒准备叉掉重来看上一步什么问题的时候。意外地,到了catch代码块,exception了,非常好,正是我想要的。。。。
try { beforeCall(); callable.prepare(tries != 0); // if called with false, check table status on ZK return callable.call(); } catch (Throwable t) { if (LOG.isTraceEnabled()) { LOG.trace("Call exception, tries=" + tries + ", retries=" + retries + ", retryTime=" + (EnvironmentEdgeManager.currentTimeMillis() - this.globalStartTime) + "ms", t); }
得到debug中e的message信息如下:
org.apache.hadoop.net.ConnectTimeoutException:
20000 millis timeout while waiting for channel to be ready for connect. ch :
java.nio.channels.SocketChannel[connection-pending
remote=hadoop/192.168.0.105:50578]
开心及气愤并存着,它这个鬼level是trace的,完全没有打印告知咱,若不是debug一回,深埋的小石头咱发现不了啊,顿时眼泪都流没了。。。。
咱比较笨,到这里,还没有立马想到为什么会连到105,
105是我的T510机器的IP,第一反应,难道locate时候会cache数据写到文件中,查看了project也没有生成任何hbaes相关的文件,再回头看,region
server的域名。。。hadoop.....
oh...查看hosts文件,正是IP 105映射着hadoop.真相大白了。。。
那些Will not attempt to authenticate using SASL (java.lang.SecurityException:
无法定位登录配置) 错误没关紧要。
事实是这样的:
1.hbase connection
是RPC的关键。connection通过查zookeeper来获取master地址,也通过zk获取meta的地址,再通过meta获取对应region
server的地址。通过根据这些location信息,结合相关的操作获取stub.再通过stub发送网络包进行远程请求调用。。而获取到的location都是从hbase
server(zk)中返回的,它是集群中的域名或地址,生成stub的时候,是我们本地拿到这个location去请求server.
所以要保持win7的域名解析和集群中的域名解析要一致。学习过程中,我们还是好好地规范一下我们的环境吧,
小小的问题,大大的折腾。。。anyhow
,还是有一点点收获吧。