HBase优化

来源:互联网 发布:基础建筑学软件 编辑:程序博客网 时间:2024/06/05 15:47

1.面向高并发写入优化的问题

当put并发很高时,memstore容易频繁写满,进而容易产证较多的store file,store较多则容易compaction较多

因此优化应保证负载均衡,请求能均匀的分布到每个region中,否则局部rs处理能力必然小于预期;其次要保证写入顺畅不受阻塞,这是保证吞吐量的基础

fliush频繁会导致产生很多小的store file,小文件过多会导致too many open file异常,也会降低sync效率,容易出发阻塞写入的条件,

为了较少文件数量会进行compaction,但若控制不当则容易导致大文件频繁参与,最终占用过多的磁盘和网络io


解决方案:

预分region

----预分region,使region在集群中均匀分布,

----禁用auto split,防止auto split无法提供服务的时间导致写入阻塞,也可防止写入过多导致region数量失控

----对于特殊的、容易导致写入不均匀的key,根据经验将它们分布到不同region,以key为时间戳为例,可以为时间戳随机分配定长的分片前缀,使同一时间段的记录分配到不同region中且同一分片内记录连续;对应的get和scan操作时,对不同分片分别处理,最后进行归并

保证写入顺畅

写入最消耗的环节在于wal,写入hlog

----对写入数据丢失不敏感时,可设置setDurability延迟或者禁用,写入时可不比等待HDFS返回结果,大幅度提高写入效率

----增大memstore阻塞写入阈值hbase.regionserver.gloabal,memstore.upperlimit,当memstore达到此阈值时,会阻塞等待flush

----增大hbase.hstore.blockingstorefiles,列族中的store file达到该阈值时会阻塞写入,等待compaction;一般设置为hbase.hstorecompaction.max的1.5-2倍

----防止小文件过多的相关配置 1.提高memstore单次flush出的文件大小(hbase.regionserver.global.memstore.lowerlimit的值提高)2.为了防止小文件过多,提高compaction的效率。小步快走:增加compaction执行的频率(hbase.hstore.compaction.min/hbase.hstore.compaction.max)降低前者就降低了compaction启动阈值的效果,让更多的文件参与compaction,单次参与compaction的文件数比较少,因此保持的文件数量比较少,因此有利于读取操作,但是同一块文件可能会被多次compaction因此总效率比较低。且启动阈值比较低,会持续占用带宽。

大步慢走:提高以上两个配置项的值以增加每次compaction的文件数量变多,占用带宽多,compaction总效率比较高,由于启动compaction的阈值比较高因此保持的文件数量较多,每次get操作带来较多的sync

当多个region同时在一个rs上挂载的时候,需要启动更多线程并发执行compaction(调整这两个参数hbase.regionserver.thread.compaction.large/hbase.regionserver.thread.compaction.small)

减少不必要的网络和磁盘io

服务尖峰时期,major compaction需要列族中的所有store file参与,会占用大量的网络资源和磁盘资源,(hbase.offheap.start.hour/hbase.offpeak.end.hour)表示服务非尖峰时间,可以尽可能避免尖峰时刻出现major compaction,hbase.hstore.compaction.ratio.offheap

尖峰时期减少带宽占用,调高ratio,文件长度差尽可能小

非尖峰时期,尽可能让文件数量变少,可以调大文件长度差

限制compaction带宽hbasehstore.comnpaction.maxsize禁止长度大于此阈值的storefile参与compaction。删除和覆盖操作较少的情况适用


面向高并发随机读的优化

hbase并不适合随机读取,每一个get都会转换为scan,在rs中针对每一个存在查询rowkey且时间戳在时间范围内的store file进行操作。可使用布隆过滤器查询rowkey是否存在。时间戳范围在file info块中可以快速查询,要进行sync操作一次读取操作扩大为多次索引查找。store fiel中数据保存的基本单位时block,每次sync和next操作时如果对应的block没有缓存则需要将其从磁盘中读出,在内存中进行操作。当并发足够高时,内存缓存频繁置换时,每次读取操作在磁盘当中变为sync和整个block的读取。

随机度过多会极大影响sata盘的io性能,block cache频繁置换会导致频繁gc。