本地远程连接HBase

今天学习到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端口

综上所述,只要进行如下步骤就可以成功连接了:

  1. 将阿里云服务器公网IP和自己的集群主机名写到本地hosts文件里
  2. 每一台阿里云服务器安全组开放2181和16020端口(不过这样不是谁都可以看到我的数据了?应该有权限设置,还没学到。不过生产环境也不可能放到公网把?不懂,什么都不知道的大学生太惨了)
  3. 然后把集群上的HBase配置文件放到resource下
    在这里插入图片描述
  4. 然后就可以运行代码了(当然已经导入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细节还是不错的,问题能自己推出来了,嘿嘿


版权声明:本文为weixin_42167895原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。