HBase Java API 开发:表的扫描与扫描的缓存和批量处理 第1关:批量处理

30 篇文章 5 订阅
15 篇文章 11 订阅

批量操作

如果我们去查看HBaseAPI的源码会发现,在上次实训中我们使用的delete、get,put这些批量操作,实际上都是调用了batch()方法。

查看put(List<Put> puts)函数源码:

我们可以发现put(List<Put> puts)方法最终还是调用的batch(final List<? extends Row> actions, final Object[] results, int rpcTimeout),其他getdelete的批量操作也同样。

所以我们如果既有get操作又有Put操作那是不是可以整合在一起呢?

答案是肯定的。

我们来看个例子:

List<Row> rows = new ArrayList<>();
//上传操作
Put put = new Put(Bytes.toBytes("row1"));
put.addColumn(Bytes.toBytes("data"),Bytes.toBytes("2"), Bytes.toBytes("value1"));
rows.add(put);
//删除操作
Delete delete = new Delete(Bytes.toBytes("row1"));
delete.addColumn(Bytes.toBytes("data"),Bytes.toBytes("1"));
rows.add(delete);
//获取操作
Get get = new Get(Bytes.toBytes("row1"));
get.addColumn(Bytes.toBytes("data"),Bytes.toBytes("2"));
rows.add(get);
//定义结果数组长度
Object[] results = new Object[rows.size()];
table.batch(rows, results);//这是一个同步的操作,批量操作的结果将会在操作之后放在results中
for (Object object : results) {
System.out.println(object.toString());
}

上述代码deleteput操作的结果为keyvalues=NONE,即没有结果,当然如果get操作没有获取到结果也会输出keyvalues=NONE。 有结果则会输出类似这样的数据:keyvalues={row1/data:1/1543220978519/Put/vlen=7/seqid=0} 是一个Result类型的对象。

值的注意的是:最好不要将put和delete操作放在同一个批处理的请求中,因为这样会有很大的风险。在学习多线程的时候我们学过多线程三大特性之一有序性,也许会因为其他原因导致操作的实现顺序不同,这样会产生不可预料的结果,还有就是资源竞争,会使结果波动。

上述使用的是同步的方式进行批量操作,其实API还提供了一个异步执行的方法

table.batchCallback(actions, results, callback):


batchCallback(
final List<? extends Row> actions, final Object[] results, final Batch.Callback<R> callback)
 

在我们需要使用异步执行批量操作,并且想要获取异步执行结果的时候可以考虑使用batchCallback()方法,Batch.Callback<R> callback就是异步执行结果的监听器。

编程要求

纸上得来终觉浅,我们来实际操练吧,在右侧编辑器begin-end处编写代码补全batchOp(String tablename) 函数,参数:tablename为待操作表的表名,要求实现如下操作:

  • 删除表中行键为row1row2的行;

  • 获取表中行键为row3row10的行;

  • 四个操作需要依照以上先后顺序,即先删除在获取row3,row10

不需要你直接输出,只需要将批量操作的执行结果作为返回值返回即可

package step1;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.client.coprocessor.Batch;
import org.apache.hadoop.hbase.util.Bytes;
public class Task {
 public Object[] batchOp(String tablename) throws Exception {
   /********* Begin *********/
   Configuration conf = HBaseConfiguration.create();
   Connection conn = ConnectionFactory.createConnection(conf);
   Table table = conn.getTable(TableName.valueOf(tablename));
   List<Row> rows = new ArrayList<>();
   //删除操作
   Delete delete = new Delete(Bytes.toBytes("row1"));
   Delete delete2 = new Delete(Bytes.toBytes("row2"));
   rows.add(delete);
   rows.add(delete2);
   //获取操作
   Get get = new Get(Bytes.toBytes("row3"));
   Get get2 = new Get(Bytes.toBytes("row10"));
   rows.add(get);
   rows.add(get2);
   //定义结果数组长度
   Object[] results = new Object[rows.size()];
   table.batch(rows, results);//这是一个同步的操作,批量操作的结果将会在操作之后放在results中
   //delete和put操作的结果为NONE 即没有结果
   return results;
   /********* End *********/
 }
}

start-dfs.sh

start-hbase.sh

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HBase是一个非系型数据库,它支持对扫描操作扫描可以按照行键范围或过滤器条件进行。HBase还支持缓存扫描结果,可以提高查询性能。此外,HBase还支持批量处理,可以同时对多行进行操作,提高处理效率。 ### 回答2: HBase是一种分布式、可扩展的列式存储系统,是基于Hadoop的海量数据存储解决方案之一,使用Java语言编写。HBase扫描扫描缓存批量处理HBase的重点开发难点之一。本文将从这三个方面来探讨HBase开发。 1. HBase扫描 HBase无法像传统系型数据库那样直接进行SQL查询,它的查询方式是通过扫描中的行来进行。HBase扫描可以采用Scan类来实现,在Scan类中可以指定要扫描的范围、列限定器等。扫描时会返回Scanner类,通过Scanner逐行扫描中的数据并将扫描结果以一定的格式返回。在扫描时,可以指定不同的过滤器来帮助筛选需要的数据。如果需要查询中所有数据,则可以省略Scan类中的startRow和stopRow参数。 2. 扫描缓存HBase中,扫描的结果是比较大的,而且数据分散存储在多个节点上,因此需要采用缓存机制来进行优化。在HBase中,使用了一种叫做BlockCache的缓存机制。BlockCache是一个缓存组件,它缓存了HFile中的块(Block),并为读取请求提供服务。使用BlockCache可以有效地减少IO操作,提高HBase的查询性能。 3. 批量处理 在处理大规模数据时,HBase常常需要进行批量处理,以提高处理效率。HBase支持两种批量处理机制:一种是批量Get操作,另一种是批量Put和Delete操作批量Get操作可以通过get(List<Get> gets)方法来实现,批量Put和Delete操作可以通过put(List<Put> puts)和delete(List<Delete> deletes)方法来实现。这些方法可以将多个操作同时提交到HBase中,以减少网络通信次数和IO操作,提高数据访问速度和性能。 综上所述,HBase扫描扫描缓存批量处理HBase开发中的重点难点之一。了解和掌握这些知识,可以帮助HBase开发人员更好地优化HBase的性能和提高数据处理效率。 ### 回答3: HBase是一个分布式的列式存储系统,它是建立在Hadoop上的,它的数据是按行存储的,同一行的数据存储在同一列族中,而且HBase还提供了扫描扫描缓存批量处理功能,可以更好地应对大规模数据的存储和查询。 首先,要讨论扫描功能。扫描是指在HBase中通过对一张进行遍历,扫描所需要的所有行数据信息。通过HBase提供的Scan API,可以实现对指定扫描,可以设置扫描的起始行、结束行、扫描列、过滤器等。Scan的过程就是在Region Server上进行的,当然一个region server可以同时扫描多个region。Scan操作返回一个ResultScanner对象,该对象可以迭代返回扫描到的每一行数据,这个扫描结果可以用来进行数据处理、数据统计等。 其次,说一下扫描缓存扫描缓存是指在HBase的Region Server上,扫描结果一般是一个KV数据对(Key-Value数据对,即键值对),这些扫描结果会被Region Server缓存在内存中,以便后续操作使用。而HBase中提供了一种扫描缓存设置,可以有效地控制Region Server上的缓存大小,避免内存占用过高,对性能有影响。HBase提供了两种类型的扫描缓存,分别是Client和Server端缓存。Client端缓存是通过设置Scan的 setCaching() 方法来控制,它是在客户端扫描时就在内存中缓存好的数据,在迭代扫描结果时,可以减少客户端向Region Server发送请求的次数,有效提高客户端的性能。而Server端缓存是通过设置Region Server的 Scanner 子模块中的 CacheBlocks 参数来控制,这个参数是示对HFile进行扫描时,是否在HFile中缓存数据块,也就是在RegionServer上缓存了KV数据对。 最后,要说一下批量处理批量处理是指在HBase中一次性处理多行数据的操作,可以在Region Server上执行。这个操作通过HBase提供的Batch API来实现,可以一次性操作多行数据。使用Batch API时,首先需要创建一个操作,将所有需要修改的行键和对应的操作(如Put、Delete等)添加到列中,然后将列传递给Batch API进行处理。Batch API会将所有的操作封装成一次批处理,一次性向Region Server发送,达到批量处理的效果。批量处理可以大大提高数据处理的效率,尤其是在需要对大数据量进行修改时,可以减少网络带宽和IO资源的使用,提高系统吞吐量。 总之,HBase扫描扫描缓存以及批量处理功能,是对大规模数据存储和查询的重要支撑。通过使用这些功能,可以减少网络带宽和IO资源的使用,大大提高系统的性能,为企业的数据管理提供了便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值