《HBase权威指南》一3.3 批量处理操作

3.3 批量处理操作

现在我们已经介绍过添加、检索和删除表中数据的操作了,不过前面介绍的操作都是基于单个实例或基于列表的操作。这一节将会介绍一些API调用,这些调用可以批量处理跨多行的不同操作。

文字事实上,许多基于列表的操作,如delete(List deletes)或者get(List gets),都是基于batch()方法实现的。它们都是一些为了方便用户使用而保留的方法。如果你是新手,推荐使用batch()方法进行所有操作。
下面的客户端API方法提供了批量处理操作。用户可能注意到这里引入了一个新的名为Row的类,它是Put、Get和Delete的祖先,或者说是父类。

void batch(List< Row> actions,Object[] results)
  throws IOException,InterruptedException
Object[] batch(List< Row> actions)
  throws IOException,InterruptedException

使用同样的父类允许在列表中实现多态,即放入以上3种不同的子类。这种调用跟之前介绍的基于列表的调用方法一样简单易用。下面的例3.16展示了如何把不同的操作融合为一个服务器端调用。

图像说明文字请注意,不可以将针对同一行的Put和Delete操作放在同一个批量处理请求中。为了保证最好的性能,这些操作的处理顺序可能不同,但是这样会产生不可预料的结果。由于资源竞争,某些情况下,用户会看到波动的结果。
例3.16 使用批量处理操作的应用示例

private final static byte[] ROW1 = Bytes.toBytes("row1");
private final static byte[] ROW2 = Bytes.toBytes("row2");
private final static byte[] COLFAM1 = Bytes.toBytes("colfam1");
private final static byte[] COLFAM2 = Bytes.toBytes("colfam2");
private final static byte[] QUAL1 = Bytes.toBytes("qual1");
private final static byte[] QUAL2 = Bytes.toBytes("qual2");

List< Row> batch = new ArrayList< Row>();

Put put = new Put(ROW2);
put.add(COLFAM2,QUAL1,Bytes.toBytes("val5"));
batch.add(put);

Get get1 = new Get(ROW1);
get1.addColumn(COLFAM1,QUAL1);
batch.add(get1);

Delete delete = new Delete(ROW1);
delete.deleteColumns(COLFAM1,QUAL2);
batch.add(delete);

Get get2 = new Get(ROW2);
get2.addFamily(Bytes.toBytes("BOGUS"));
batch.add(get2);

Object[] results = new Object[batch.size()];
try {
  table.batch(batch,results);
} catch(Exception e){
  System.err.println("Error: " + e);
}

for(int i = 0;i < results.length;i++){
  System.out.println("Result[" + i + "]: " + results[i]);
}

使用常量可以方便重用。

创建列表存放所有操作。

添加一个Put实例。

添加一个针对不同行的Get实例。

添加一个Delete实例。

添加一个会失败的Get实例。

创建一个结果数组。

打印捕获的异常。

打印所有结果。

从控制台上可以看到以下结果:

Before batch call...
KV: row1/colfam1:qual1/1/Put/vlen=4,Value: val1
KV: row1/colfam1:qual2/2/Put/vlen=4,Value: val2
KV: row1/colfam1:qual3/3/Put/vlen=4,Value: val3

Result[0]: keyvalues=NONE
Result[1]: keyvalues={row1/colfam1:qual1/1/Put/vlen=4}
Result[2]: keyvalues=NONE
Result[3]: org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException:
   org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException:
   Column family BOGUS does not exist in ...

After batch call...
KV: row1/colfam1:qual1/1/Put/vlen=4,Value: val1
KV: row1/colfam1:qual3/3/Put/vlen=4,Value: val3
KV: row2/colfam2:qual1/1308836506340/Put/vlen=4,Value: val5

Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException:
 Failed 1 action: NoSuchColumnFamilyException: 1 time,
 servers with issues: 10.0.0.43:60020,

与之前的例子一样,在执行批量处理之前,由于插入了测试行的数据,因此先打印了测试行的相关输出。首先输出的是表的原内容,然后是示例代码产生的输出,最后输出的是操作以后的表的内容。由输出结果可见,要删除的列被删除了,新添加的列也成功添加了。

Get操作的结果需要观察输出结果的中间部分,即示例代码产生的输出。那些以Result[n](n从0到3)开头的输出是actions参数中对应操作的结果。示例中第一个操作是Put,对应的结果是一个空的Result实例,其中没有KeyValue实例。这是批量处理调用返回值的通常规则,它们给每个输入操作返回一个最佳匹配的结果,可能的返回值如表3-7所示。

更进一步地观察控制台上输出的返回结果数组,你会发现空的Result实例打印出来是:keyvalues=NONE。Get请求成功找到了相匹配的结果,返回一个对应的KeyValue实例。最后,有一个BOGUS列族的操作请求并返回一个异常供用户参考。

文字当用户使用batch()功能时,Put实例不会被客户端写入缓冲区缓冲。batch()请求是同步的,会把操作直接发送到服务器端,这个过程没有什么延迟或其他中间操作。这与put()调用明显不同,所以请慎重挑选需要的方法。

有两种不同的批量处理操作看起来非常相似。不同之处在于,一个需要用户输入包含返回结果的Object数组,而另一个由函数帮助用户创建这个数组。为什么需要两个方法呢?它们的语义有什么不同吗(如果有不同的话)?它们都可能抛出之前见到过的RetriesExhaustedWithDetailsException,所以关键的不同在于:

void batch(List<Row> actions,Object[] results)
     throws IOException,InterruptedException

上面这个方法让用户可以访问部分结果,而下面这个方法不行:

Object[] batch(List<Row> actions)
  throws IOException,InterruptedException

后面这个方法如果抛出异常的话,不会有任何返回结果,因为新结果数组返回之前,控制流就中断了。

而之前的方法会先向用户提供的数组中填充数据,然后再抛出异常。例3.16的代码就采用了前一种方法,并提交了结果数组。下面是一些batch()方法特性的汇总。

两种方法的共同点

get、put和delete都支持。如果执行时出现问题,客户端将抛出异常并报告问题。它们都不使用客户端写缓冲区。

void batch(actions, results)

能够访问成功操作的结果,同时也可以获取远程远程什么需要两个方法呢?他失败时的异常。

Object[] batch(actions)

只返回客户端异常,不能访问程序执行中的部分结果。

文字在检查结果之前,所有的批量处理操作都被执行了:即使用户收到一个操作的异常,其他操作也都已经执行了。不过,在最坏的情况下,可能所有操作都会返回异常。

另外,批量处理可以感知暂时性错误,例如NotServingRegionException(表明一个region已经被移动)会多次重试这个操作。用户可以通过调整hbase.client.retries.number配置项(默认是10)来增加或减少重试次数。

时间: 2024-11-02 05:30:07

《HBase权威指南》一3.3 批量处理操作的相关文章

《HBase权威指南》一导读

前 言 HBase权威指南 你阅读本书的理由可能有很多.可能是因为听说了Hadoop,并了解到它能够在合理的时间范围内处理PB级的数据,在研读Hadoop的过程中发现了一个处理随机读写的系统,它叫做HBase.或者将其称为目前流行的一种新的数据存储架构,传统数据库解决大数据问题时成本更高,更适合的技术范围是NoSQL. 无论你是如何来到这里的,我都希望你能够了解并学习如何在企业或组织中使用HBase解决海量数据问题.你可能有关系型数据库的背景,但更希望去研究这个"列式存储"系统:也许你

《HBase权威指南》一第1章 简介

第1章 简介 HBase权威指南 在探究HBase的功能之前,我认为有必要先来思考一下为什么要设计出这样一套新的存储架构.传统的关系型数据库管理系统(Relational Database Management System,RDBMS)早在20世纪70年代已经出现,并且帮助无数的公司和机构实现了给定问题的解决方案,时至今日,RDBMS仍旧非常有用.很多情况下关系模型都能够非常完美地阐述问题,但是在面对一些特殊的场景时关系模型并不是最佳的解决方案.①

《HBase权威指南》一1.5 HBase:Hadoop数据库

1.5 HBase:Hadoop数据库 看过BigTable的架构之后,我们可能会简单地认为HBase完全是Google的BigTable的开源实现.但是这个说法可能过于简单,因为两者之间还有些差异(大多是细微的)值得一提. 1.5.1 历史 HBase是Powerset㉑在2007年创建的,最初是Hadoop的一部分.之后,它逐步成为Apache软件基金会旗下的顶级项目,具备Apache软件许可证,版本为2.0. HBase项目的主页是http://hbase.apache.org/,通过这个

《HBase权威指南》一3.2 CRUD操作

3.2 CRUD操作 数据库的初始基本操作通常被称为CRUD(Create,Read,Update,Delete),具体指增.查.改.删.HBase中有与之相对应的一组操作,随后我们会依次介绍.这些方法都由HTable类提供,本章后面将直接引用这个类的方法,不再特别提到这个包含类. 接下来介绍的操作大多都能不言自明,但本书有一些细节需要大家注意.这意味着,对于书中出现的一些重复的模式,我们不会多次赘述. 文字你所看到的示例源代码都可以从GitHub的公用源中下载,具体地址为https://git

《HBase权威指南》一3.5 扫描

3.5 扫描 在讨论过基本的CRUD类型的操作之后,现在来看一下扫描(scan)技术,这种技术类似于数据库系统中的游标(cursor),并利用到了HBase提供的底层顺序存储的数据结构.⑧ 3.5.1 介绍 扫描操作的使用跟get()方法非常类似.同样,和其他函数类似,这里也提供了Scan类.但是由于扫描操作的工作方式类似于迭代器,所以用户无需调用scan()方法创建实例,只需调用HTable的getScanner()方法,此方法在返回真正的扫描器(scanner)实例的同时,用户也可以使用它迭

《HBase权威指南》一1.1 海量数据的黎明

1.1 海量数据的黎明 我们生活在一个互联网时代,无论是想搜索最佳的火鸡菜谱,还是送妈妈什么样的生日礼物,都希望能够通过互联网迅速地检索到问题的答案,同时希望查询到的结果有用,而且非常切合我们的需要. 因此,很多公司开始致力于提供更有针对性的信息,例如推荐或在线广告,这种能力会直接影响公司在商业上的成败.现在类似Hadoop②这样的系统能够为公司提供存储和处理PB级数据的能力,随着新机器学习算法的不断发展,收集更多数据的需求也在与日俱增. 以前,因为缺乏划算的方式来存储所有信息,很多公司会忽略某

《HBase权威指南》一3.1 概述

3.1 概述 HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成向HBase存储和检索数据,以及删除无效数据之类的操作.在介绍这个类的各个方法之前,让我们先了解一下它的大体功能. 所有修改数据的操作都保证了行级别的原子性,这会影响到这一行数据所有的并发读写操作.换句话说,其他客户端或线程对同一行的读写操作都不会影响该行数据的原子性:要么读到最新的修改,要么等待系统允许写入该行修改.更多内容请参考第8章.①

《HBase权威指南》一1.4 结构

1.4 结构 本节首先介绍HBase的架构,然后介绍一些关于HBase起源的背景资料,之后将介绍其数据模型的一般概念和可用的存储API,最后在一个更高的层次上对其实现细节进行分析. 1.4.1 背景 2003年,Google发表了一篇论文,叫"The Google File System"(http://labs.google.com/papers/gfs.html).这个分布式文件系统简称GFS,它使用商用硬件集群存储海量数据.文件系统将数据在节点之间冗余复制,这样的话,即使一台存储

HBase权威指南环境配置

系统采用ubuntu-14.04,64bit 1.安装git sudo apt-get install git 出现下面错误: Err http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main git-man all 1:1.9.1-1ubuntu0.1 404 Not Found [IP: 91.189.91.15 80] Err http://security.ubuntu.com/ubuntu/ trusty-security/mai