HBase单机模式下远程客户端访问无响应
产生原因:客户端在调用org.apache.hadoop.hbase.zookeeper.MetaTableLocator类的public static RegionState getMetaRegionState(ZooKeeperWatcher zkw, int replicaId)时用到的是远程主机名而非IP地址。
org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.ServerName sn = rl.getServer();
serverName = ServerName.valueOf(sn.getHostName(), sn.getPort(), sn.getStartCode());
代码中的getHostName()得到的就是主机名。比如远程主机在linux上面,则在远程主机shell环境下输入hostname得到的值就是主机名,如abinge-ubuntu。为什么返回的是主机名应该跟hbase服务器那边的具体实现有关。显然如果返回的是主机名,客户端这边可能就无法根据主机名定位到meta数据所在机器。
解决办法:最简单的解决办法就是在客户端机器的hosts文件中配置主机名到IP地址的映射关系,假设远程主机IP为10.33.22.21,则在客户端主机的hosts文件中添加一行:
10.33.22.21 abinge-ubuntu
如此一来,客户机就可以根据主机名找到对应的IP地址,从而从服务器端获取meta数据信息。否则客户端程序就好像死机了一样,既不报错,也没有数据返回。等到超过一定时间就报超时的错误。貌似是20分钟(12000秒)。
如有不当之处,还望指正。谢谢!