今天学习到HBase客户端的内容,突然想亲自试验下有关Scan缓存的内容,上次只是看别人操作过。但是HBase这回不是在本地是在阿里云上。一开始连接不上,后面想到刚刚学到的:
Connection的连接:例如,集群里有2个Master、5个RegionServer。那么Connection会维持一个到Active Master的TCP和5个到RegionServer的TCP。
从这里可以看出,我们的客户端需要需要连接到hbase服务,同时根据报错信息也可以看出需要打开16020端口
客户端从Region读取数据的流程:首次本地没有meta缓存需要去ZK集群获取hbase:meta所在的RegionServer的位置
从这里可以看出我们需要连接到ZK,所以需要打开2181端口
综上所述,只要进行如下步骤就可以成功连接了:
- 将阿里云服务器公网IP和自己的集群主机名写到本地hosts文件里
- 每一台阿里云服务器安全组开放2181和16020端口(不过这样不是谁都可以看到我的数据了?应该有权限设置,还没学到。不过生产环境也不可能放到公网把?不懂,什么都不知道的大学生太惨了)
- 然后把集群上的HBase配置文件放到resource下
- 然后就可以运行代码了(当然已经导入maven依赖了)
Configuration conf = HBaseConfiguration.create();
try (Connection connection = ConnectionFactory.createConnection(conf)) {
try (Table table = connection.getTable(TableName.valueOf("ns1:t1"))) {
// scan设置
Scan scan = new Scan();
try (ResultScanner scanner = table.getScanner(scan)) {
// 每次scanner.next()返回一个结果
for (Result result : scanner) {
// 这里可以看出每一个result中的cell都是相同的rowKey
final String rowKey = Bytes.toString(result.getRow());
System.out.println(rowKey);
// 1个result结果包含N个cells
for (Cell cell : result.listCells()) {
System.out.print("[" +
Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) + ":" +
Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()) + "]" + "\t"
);
}
System.out.println("------------------------------------------");
}
}
}
}
结果出来了
知道一些HBase细节还是不错的,问题能自己推出来了,嘿嘿