HBase Java API 开发:表的扫描与扫描的缓存和批量处理 第3关:在扫描中使用缓存和批量参数

扫描器缓存

ResultScanner scanner = table.getScanner(scan);
for(result res : scanner){
...
}

上一关我们使用的ResultScanner类循环扫描表中的数据,ResultScanner继承了Iterable接口,是一个迭代器,所以在for循环遍历ResultScanner对象的时候实际调用的是ResultScanner对象的next()方法,每个next()调用都会产生一个单独的RPC请求,使用next(int nbRows)也是一样,而我们都知道发送请求是很耗时的操作,所以这样做性能并不好。

咋办呢?

如果一次RPC请求可以获取多行数据,这样就能有效的减少请求的次数,ResultScanner类就提供了一个方法可以让我们设置一次请求的缓存大小:

void setCaching(int caching)//设置缓存大小

当我们要扫描的表比较大时,使用设置缓存的方式确实可以有效的提高程序的效率,不过一招鲜并不能吃遍天。

有时候,我们并不需要将整张表都扫描,如果扫描一整张表,就会造成一些性能浪费,JavaAPI提供了方法供我们来解决这些问题:

Scan scan = new Scan();
scan.addColumn(Bytes.toBytes(
### HBase Java API 扫描缓存批量处理 #### 使用 `Scan` 类进行扫描 为了执行扫描,在HBase中主要依赖于 `org.apache.hadoop.hbase.client.Scan` `ResultScanner` 这两个类。前者定义了查询参数,后者则是返回的结果集迭代器。 ```java // 创建一个新的 Scan 实例来设置起始行键结束行键 Scan scan = new Scan(); scan.setStartRow(Bytes.toBytes("start_row_key")); scan.setStopRow(Bytes.toBytes("end_row_key")); // 添加过滤条件或其他属性给 Scan 对象 Filter filter = new SingleColumnValueFilter( Bytes.toBytes("family"), Bytes.toBytes("qualifier"), CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("value")) ); scan.setFilter(filter); // 获取 ResultScanner 来遍历结果集合 try (Table table = connection.getTable(TableName.valueOf("table_name"))) { try (ResultScanner scanner = table.getScanner(scan)) { for (Result result : scanner) { System.out.println(result); } } } catch (IOException e) { throw new RuntimeException(e); } ``` #### 配置扫描缓存大小 调整客户端每次请求从服务器端拉取的数据量可以通过修改 `hbase.client.scanner.caching` 参数实现。此配置决定了一次RPC调用能带回多少条记录,默认情况下该值设为100。如果希望提高性能并减少网络开销,可以根据实际情况适当增大这个数值[^3]。 ```xml <property> <name>hbase.client.scanner.caching</name> <value>500</value><!-- 修改为你想要的数量 --> </property> ``` 在应用程序内部也可以动态设定每批次读取的最大行数: ```java int cachingNum = 500; scan.setCaching(cachingNum); // 设置每次RPC最多获取cachingNum行数据 ``` #### 批量导入CSV至HFile 对于大规模数据加载场景下,推荐采用批量化方式将外部文件转换成预写日志格式(HFiles),再一次性导入到目标格内。这不仅能够显著提升效率还能降低对在线服务的影响[^4]。 ```bash # 将本地csv上传至指定路径下的HDFS目录 hdfs dfs -put /local/path/to/file.csv /user/hadoop/input/ # 调用ImportTsv工具完成转换过程 hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \ -Dimporttsv.separator="," \ -Dimporttsv.columns=&#39;HBASE_ROW_KEY,family:column1,family:column2,...&#39; \ -Dimporttsv.bulk.output=/output/dir \ tablename \ /user/hadoop/input/ ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值