HBase性能优化方法总结(二):写表操作

转自:http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section2.html
2. 写表操作

2.1 多 HTable 并发写

创建多个 HTable 客户端用于写操作,提高写数据的吞吐量,一个例子:

static final Configuration conf = HBaseConfiguration.create();
static final String table_log_name = “user_log”;
wTableLog = new HTable[tableN];
for (int i = 0; i < tableN; i++) {
wTableLog[i] = new HTable(conf, table_log_name);
wTableLog[i].setWriteBufferSize(5 * 1024 * 1024); //5MB
wTableLog[i].setAutoFlush(false);
}

2.2 HTable 参数设置

2.2.1 Auto Flush

通过调用 HTable.setAutoFlush(false)方法可以将 HTable 写客户端的自动 flush 关闭,这样
可以批量写入数据到 HBase,而不是有一条 put 就执行一次更新,只有当 put 填满客户端写缓
存时,才实际向 HBase 服务端发起写请求。默认情况下 auto flush 是开启的。

2.2.2 Write Buffer

通过调用 HTable.setWriteBufferSize(writeBufferSize)方法可以设置 HTable 客户端的写
buffer 大小,如果新设置的 buffer 小于当前写 buffer 中的数据时, buffer 将会被 flush 到服
务端。其中, writeBufferSize 的单位是 byte 字节数,可以根据实际写入数据量的多少来设置
该值。

2.2.3 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.3 批量写

通过调用 HTable.put(Put)方法可以将一个指定的 row key 记录写入 HBase,同样 HBase 提供了另
一个方法:通过调用 HTable.put(List)方法可以将指定的 row key 列表,批量写入多行记录,
这样做的好处是批量执行,只需要一次网络 I/O 开销,这对于对数据实时性要求高,网络传输 RTT
高的情景下可能带来明显的性能提升。

2.4 多线程并发写

在客户端开启多个 HTable 写线程,每个写线程负责一个 HTable 对象的 flush 操作,这样结合定
时 flush 和写 buffer(writeBufferSize),可以既保证在数据量小的时候,数据可以在较短时间
内被 flush(如 1 秒内),同时又保证在数据量大的时候,写 buffer 一满就及时进行 flush。下
面给个具体的例子:

for (int i = 0; i < threadN; i++) {
Thread th = new Thread() {
public void run() {
while (true) {
try {
sleep(1000); //1 second
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (wTableLog[i]) {
try {
wTableLog[i].flushCommits();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
};
th.setDaemon(true);
th.start();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值