本篇文章主要承接第一篇文章,继续讲解更加高效的batch操作。
在上一篇文章,我们讲解了许多基于列表的操作。如:delete(List<Delete> deletes) 或者是 get(List<Get> gets) 都是基于batch 方法实现的。
我们看下batch 操作的函数原型
/**
* Method that does a batch call on Deletes, Gets, Puts, Increments, Appends, RowMutations.
* The ordering of execution of the actions is not defined. Meaning if you do a Put and a
* Get in the same {@link #batch} call, you will not necessarily be
* guaranteed that the Get returns what the Put had put.
*
* @param actions list of Get, Put, Delete, Increment, Append, RowMutations.
* @param results Empty Object[], same size as actions. Provides access to partial
* results, in case an exception is thrown. A null in the result array means that
* the call for that action failed, even after retries. The order of the objects
* in the results array corresponds to the order of actions in the request list.
* @throws IOException
* @since 0.90.0
*/
void batch(final List<? extends Row> actions, final Object[] results) throws IOException,
InterruptedException;
注意几点:
1. 传给服务端的操作并不能保证 按照客户端列表中的顺序按照顺序执行 !!!
2. 但是可以保证返回的结果,按照传递的List进行赋值。因此,建议用 ArrayList 传递,可以保证结果按照传过去的顺序赋值。
3.这里面Row 类, 是 Put, Get, Delete的祖先, 或者说是父类。
4.使用batch() 功能时,Put实例不会被客户端写入缓冲区缓冲。batch() 请求是同步的,会把操作直接发送到服务段,这个过程没有什么延迟或者其他中间操作。
batch 操作可能的返回值
null
操作与远程服务器通信失败
EmptyResult
Put 和 Delete 操作成功后的返回结果
Result
Get 操作成功的返回结果,如果没有匹配的行或列,返回空的Result
Throwable
当服务器返回一个异常时,这个异常会按原样返回给客户端。用户可以使用这个异常检查哪里出了错,也许可以在自己的代码中主动处理异常。
测试代码:
package hbase_2;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.ArrayList;
import java.util.List;
/**
* Created by szh on 2020/4/21.
*
* @author szh
*/
public class Hbase_BatchApi {
public static void main(String[] args) throws Exception {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "cdh-manager,cdh-node1,cdh-node2");
conf.set("hbase.zookeeper.property.clientPort", "2181");
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin = conn.getAdmin();
// ======== 基本信息 =========
// 创建表(包含多个列簇)
TableName tableName = TableName.valueOf("test3");
String[] columnFamilys = {"article", "author"};
Table table = conn.getTable(tableName);
List<Row> batchOperate = new ArrayList<Row>();
//batch()调用可能返回的结果
//null 操作与远程服务器的通信失败
//EmptyResult : 表现为输出为 keyvalues=NONE Put和Delete操作成功后的返回结果
//Result: Get操作成功的返回结果,如果没有匹配的行或列,会返回空的Result
//Throwable: 当服务器端返回一个异常时, 这个异常会按原样返回给客户端。
// 用户可以使用这个异常检查哪里出了错,也许可以在自己的代码中自动处理异常。
Get get1 = new Get(Bytes.toBytes("ce_shi2"));
batchOperate.add(get1);
Put put1 = new Put(Bytes.toBytes("ce_shi3"));
put1.addColumn(Bytes.toBytes("author"), Bytes.toBytes("name"), Bytes.toBytes("sunzhenhua"));
put1.addColumn(Bytes.toBytes("author"), Bytes.toBytes("age"), Bytes.toBytes("12"));
batchOperate.add(put1);
Put put2 = new Put(Bytes.toBytes("ce_shi1"));
put2.addColumn(Bytes.toBytes("author"), Bytes.toBytes("name"), Bytes.toBytes("zhouyuqin"));
batchOperate.add(put2);
Delete del1 = new Delete(Bytes.toBytes("ce_shi1"));
del1.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"));
batchOperate.add(del1);
Object[] results = new Object[batchOperate.size()];
try {
table.batch(batchOperate, results);
} catch (Exception e) {
e.printStackTrace();
}
for (int i = 0; i < results.length; i++) {
System.out.println("Result [" + i + "]: " + results[i]);
}
}
}