Hbase写入数据的几种方式
我们总结一下hbase几种写入常见的方式,以及涉及的应用场景,另外再总结一下其中涉及到的一些原理知识。hbase一般的插入过程都使用HTable对象,将数据封装在Put对象中,Put在new创建的时候需要传入rowkey,并将列族,列名,列值add进去。然后HTable调用put方法,通过rpc请求提交到Regionserver端。写入的方式可以分为以下几种
- 单条put
- 批量put
- bluckload
HTable介绍
要向hbase中写入就免不了要和HTable打交道,HTable负责向一张hbase表中读或者写数据,HTable对象是非线程安全的。多线程使用时需要注意,创建HTable对象时需要指定表名参数,HTable内部有一个LinkedList<Row>的队列writeAsyncBuffer ,负责对写入到hbase的数据在客户端缓存,开启缓存使用参数 table.setAutoFlushTo(false); 默认情况不开启每次put一条数据时,htable对象就会调用flushCommits方法向regserver中提交,开启缓存则会比较队列的大小,如果大于某个值则调用flushCommits,这个值默认是2m,可以通过在hbase-site.xml中设置参数 "hbase.client.write.buffer"来调整,默认是2097152, 在关闭htable连接时,会隐式的调用flushCommits方法,保证数据完全提交。提交时会根据rowkey定位该put应该提交到哪个reginserver,然后每个regionserver一组action发送出去。
注意:有了BufferedMutator之后,BufferedMutator替换了HTable的setAutoFlush(false)的作用。可以从连接的实例中获取BufferedMutator的实例。在使用完成后需要调用的close()方法关闭连接。对BufferedMutator进行配置需要通过BufferedMutatorParams完成。BufferedMutatorParams要比Htable更搞效,所以心在我们在向hbase插入数据时尽量使用BufferedMutatorParams。
单条put
最简单基础的写入hbase,一般应用场景是线上业务运行时,记录单条插入,如报文记录,处理记录,写入后htable对象即释放。每次提交就是一次rpc请求。
table.setAutoFlushTo(true);
/**
* 插入一条记录
* rowkey 为rk001 列族为f1
* 插入两列 c1列 值为001
* c2列 值为002
*
*/
public void insertPut(){
//Configuration 加载hbase的配置信息,HBaseConfiguration.create()是先new Configuration然后调用addResource方法将
//hbase-site.xml配置文件加载进来
Configuration conf = HBaseConfiguration.create();
try {
table = new HTable(conf,tableName);
table.setAutoFlushTo(true);//不显示设置则默认是true
String rowkey = "rk001";
Put put = new Put(rowkey.getBytes());
put.add(cf.getBytes(),"c1".getBytes(),"001".getBytes());
put.add(cf.getBytes(),"c2".getBytes(),"002".getBytes());
table.put(put);
table.close();//关闭hbase连接
} catch (IOException e) {
e.printStackTrace();
}
}
多条写入
有了单条的put自然就想到这种方式其实是低效的,每次只能提交一条记录,有没有上面方法可以一次提交多条记录呢?减少请求次数, 最简单的方式使用List<Put>,这种方式操