HBase_HBase2.0 Java API 操作指南 (二)Batch 操作

     

    本篇文章主要承接第一篇文章,继续讲解更加高效的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]);
        }

    }

}

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值