最近在研究hbase,查询效率确实不错,不过入库效率不理想,今天周五就小结以下。
hbase使用java 的api入库很简单:
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable();
Put p = new Put("表名");
p.add(("族列名").getBytes(), "字段名".getBytes(),"值".getBytes());
p.add...
table.put(p);
不过在最初的时候,录入一个8列的数据文件,入库的效率只有0.5MB/s,9716行/s。
后来做了若干改进,速度能达到0.8MB/s,1470行/s
具体如下:
1、修改hbase的BufferSize,并禁用hbase的自动提交功能
table.setWriteBufferSize(1024*1024*10);//这里默认值其实是64MB,所以应该改大一点比较好!
table.setAutoFlush(false);
2、禁用hbase的预写日志功能(WAL)
p.setWriteToWAL(false); //p为已近add数据后的Put对象
这些在hbase的wiki上看到过,后面准备添加lzo压缩算法来进行优化,希望能有好的结果。wiki上还有些提高hbase集群性能的方法,例如:
修改regionserver的puts的handler数
将java调整为-server模式???
提升内存,修改hbase-env.sh中的HEAP_SIZE=4000
使用64位操作系统和64位JVM
取消swap
提升CPU
建表时设置blocksize的大小,合理的region size大小,合理的regionserver flush 大小。
虚拟机参数调优:-XX:+UseParNewGC and -XX:+UseConcMarkSweepGC
前2个试过没什么作用,希望有研究过的同学能不吝赐教。
这几天在弄lzo,这方面的资料好少,等我装好测试过再来更新这篇文章。