1.HTable 参数设置
- Write Buffer 通过调用 HTable.setWriteBufferSize(writeBufferSize)方法可以设置 HTable 客户端 的写 buffer 大小,如果新设置的 buffer 小于当前写 buffer 中的数据时,buffer 将会被 flush 到服务端。其中,writeBufferSize 的单位是 byte 字节数,可以根据实际写入数据量的多少 来设置该值。
默认的大小是 2MB(即 2 097 152 字节),这个大小比较适中,一般用户插入 HBase 中的数据都相当小,即每次插入的数据都远小于缓冲区的大小。如果需要存储交到的数据, 通常需要考虑增大这个数值,从而允许客户端更高效地将一定数量的数据组成一组,通过一 个 RPC 请求来执行。 - Auto Flush
通过调用 HTable.setAutoFlushTo(false)方法可以将 HTable 写客户端的自动 flush 关闭,这样可以批量写入数据到 HBase,而不是有一条 put 就执行一次更新,只有当 put 填 满客户端写缓存时,才实际向 HBase 服务端发起写请求。默认情况下 auto flush 是开启的。 - WAL Flag:
在 HBae 中,客户端向集群中的 RegionServer 提交数据时(Put/Delete 操作),首 先会先写 WAL(Write Ahead Log)日志(即 HLog,一个 RegionServer 上的所有 Region 共享一个 HLog),只有当 WAL 日志写成功后,再接着写 MemStore,然后客户端被通知 提交数据成功;如果写 WAL 日志失败,客户端则被通知提交失败。这样做的好处是可以做 到 RegionServer 宕机后的数据恢复。 因 此 , 对 于 相 对 不 太 重 要 的 数 据 , 可 以 在 Put/Delete 操 作 时 , 通 过 调 用 Put.setWriteToWAL(false)或 Delete.setWriteToWAL(false)函数,放弃写 WAL 日志,从 而提高数据写入的性能。 值得注意的是:谨慎选择关闭 WAL 日志,因为这样的话,一旦 RegionServer 宕机, Put/Delete 的数据将会无法根据 WAL 日志进行恢复。
2.批量写
通过调用 HTable.put(Put)方法可以将一个指定的 row key 记录写入 HBase,同样 HBase 提供了另一个方法:通过调用 HTable.put(List)方法可以将指定的 row key 列表,批量写入多行记录,这样做的好处是批量执行,只需要一次网络 I/O 开销,这对于对 数据实时性要求高,网络传输 RTT 高的情景下可能带来明显的性能提升。
3.多线程并发写
创建多个 HTable 客户端用于写操作,提高写数据的吞吐量,一个例子:
1.static final Configuration conf = HBaseConfiguration.create();
2. static final String table_log_name = “user_log”;
3. wTableLog = new HTable[tableN];
4. for (int i = 0; i < tableN; i++) {
5. wTableLog[i] = new HTable(conf, table_log_name);
6. wTableLog[i].setWriteBufferSize(5 * 1024 * 1024); //5MB
7. wTableLog[i].setAutoFlush(false);
8. }
在客户端开启多个 HTable 写线程,每个写线程负责一个 HTable 对象的 flush 操作, 这样结合定时 flush 和写 buffer(writeBufferSize),可以既保证在数据量小的时候,数 据可以在较短时间内被 flush(如 1 秒内),同时又保证在数据量大的时候,写 buffer 一满 就及时进行 flush。