假设有4台机,IP及主机名如下:
192.168.100.105 c1 192.168.100.110 c2 192.168.100.115 c3 192.168.100.120 c4
调用HBase API的示例代码:
String tableName = "User"; try { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "c1:2181,c2:2181,c3:2181,c4:2181"); Connection conn = ConnectionFactory.createConnection(conf); Admin admin = conn.getAdmin(); TableName tbObj = TableName.valueOf(tableName); if (admin.tableExists(tbObj)) { //debug运行一般会卡在这句 System.out.println(tableName + "表已存在!"); } else { HTableDescriptor desc = new HTableDescriptor(tbObj); admin.createTable(desc); System.out.println(tableName + "表创建成功!"); } } catch (Exception e) { System.out.println(e); }
原因:
ZooKeeper需要使用主机名访问。
* 只能用主机名访问。也就是说,即使把代码中的主机名改成IP,也会卡死,例如:
conf.set("hbase.zookeeper.quorum", "192.168.100.105:2181,192.168.100.110:2181,192.168.100.115:2181,192.168.100.120:2181");
解决方法:
在运行代码的主机的hosts文件添加主机名和IP的映射。
Linux
vim /etc/hosts
加入以下内容:
192.168.100.105 c1 192.168.100.110 c2 192.168.100.115 c3 192.168.100.120 c4
Windows
1.打开C:WindowsSystem32driversetc目录
2.右键hosts文件属性,去掉“只读”属性(就是不勾选)
3.安全 -> 编辑 -> User(一般还有括号用户名)
4.在User的权限中,全部勾选为允许。
5.保存(确定 -> 确定 -> 确定)。
6.用记事本打开hosts文件,输入以下内容:
192.168.100.105 c1 192.168.100.110 c2 192.168.100.115 c3 192.168.100.120 c4