注册 留言板
当前位置:首页 > 云计算/大数据 > 其它 > 正文

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

来源:CSDN   发布时间: 2017-06-19   作者:mengxb12138   浏览次数:
摘要: 转自:http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section2.html 2. 写表操作 2.1 多 HT...

转自: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();
}


hbase 性能优化 数据
我来说两句
评论内容:
验  证  码:
 
(网友评论仅供其表达个人看法,并不表明本站同意其观点或证实其描述。)
评论列表
已有 0 条评论(查看更多评论)
精彩专题
  • 本月排行
  • 总排行
友情链接:
QQ交流群:①群 155252576 INFOCOOL官方交流群 ②群 469193068 WEB前端技术交流群 ③群 531831996 数据库交流群 ④群 243504572 编程技术交流群
设为首页 - 加入收藏 Copyright @2016 Infocool 版权所有 粤ICP备16000626号