Hbase优化
主要优化:预分区,row key,列族,compaction(合并),批量读写,连接池
(一)表的设计
1.1预分区(pre-creating regions)
预防数据倾斜,达到负载均衡
数据抽样
预估
1.2 Row key
Row key 用来检索表中的记录,支持以下3种方式:
Ø 通过单个row key访问:按照某个rowkey键值进行get操作。
Ø 通过row key的range进行scan:设置startRowKey和endRowKey,在这个范围内进行扫描
Ø 全表扫描:直接扫描整张表的所有记录
Row key 是按照字典序存储的。设计row key的时候,要将经常一起读取的数据存储到一块,将最近可能会被访问的数据写在一块。
举例:如果最近写入hbase的数据是最可能被访问的,可以考虑将时间戳作为row key的一部分,由于是字典序排序,row key可以是long.MAX_VALUE – timestamp作为row key,这样能保证新写入的数据在读取时可以被快速命中。
1.3列族(column family)
不能在一张表里定义太多的列族,目前hbase并不能很好的处理超过2-3个列族的表。
1.4 In Memory
创建表的时候,可以通过HColumnDescriptor.setInMemory(true)将表放到RegionServer的缓存中,保证在读取的时候被cache命中(提高查询速度)。
缓存应该放在离用户最近的地方。
1.5 MaxVersion
通过HColumnDescriptor.setMaxVersion(int MaxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,设置为1.
1.6 Time toLive
通过HColumnDescriptior.setTimeToLive(int timeToLive)设置存储生命期,过期数据自动删除。
1.7 Compaction
Hbase为了防止小文件(被刷到磁盘的menstore)过多,以保证查询效率。Hbase需要在必要的时候将这些小的storefile合并为相对较大的store file,这个过程就是compaction。
Compaction主要分为两类:minorcompaction和major compaction。
major compaction功能:将所有storefile合并成一个,合并大量文件,应该人为控制。
触发条件:major_compact命令,majorCompact() API ,region server自动运行(hbase.hregion. majorcompaction 默认为24小时)
minor compaction 较为复杂,较小合并,由hbase自动触发。
由以下参数决定:
hbase.hstore.compaction.min: 默认值为3,只有超过3个以上的storefile时,minor compaction才会启动。
hbase.hstore.compaction.max:每次合并最多选择10个store file。
hbase.hstore.compaction.ratio:minorcompaction按照文件年龄排序,minor compaction总是从older store file开始选择。
(二) 写表操作
2.1 多HTable并发写
创建多个HTable客户端用于写操作,提高写数据的吞吐量
2.2 HTable参数设置
2.3 批量写
通过调用HTable.put(Put)方法可以将一个指定的row key记录写入HBase,同样HBase提供了另一个方法:通过调用HTable.put(List<Put>)方法可以将指定的row key列表,批量写入多行记录,这样做的好处是批量执行,只需要一次网络I/O开销,这对于对数据实时性要求高,网络传输RTT高的情景下可能带来明显的性能提升。
2.4 多线程并发写
(三) 读表操作
3.1 多HTable并发读
3.2 HTable参数设置
3.3 批量读
通过调用HTable.get(Get)方法可以根据一个指定的row key获取一行记录,同样HBase提供了另一个方法:通过调用HTable.get(List)方法可以根据一个指定的row key列表,批量获取多行记录,这样做的好处是批量执行,只需要一次网络I/O开销,这对于对数据实时性要求高而且网络传输RTT高的情景下可能带来明显的性能提升
3.4 多线程并发读
连接池:已经被替换为HConnection