最近在看hbase,我们来看看官方给出一些建议:(其实官方很多都是只给建议,却并没有说为什么,对于这样的情况只能自己去做实验或者是工作中碰到去解决吧)
1、regionServer上region的个数:官方给出的建议是20-200个region,但是下面又说
如何粗略计算regionServer上region:有个公式,
HBase 0.98.x
((RS Xmx) * hbase.regionserver.global.memstore.size) / (hbase.hregion.memstore.flush.size * (# column families))+
HBase 0.94.x
((RS Xmx) * hbase.regionserver.global.memstore.upperLimit) / (hbase.hregion.memstore.flush.size * (# column families))+
貌似hbase.regionserver.global.memstore.size和
hbase.regionserver.global.memstore.upperLimit默认值都是0.4,也就是说如果我RS的内存分配16G,其他都是默认值,只有一个列族,0.98版本的一个region个数有51个,为什么这么计算?其实这是一种极限情况,hbase.regionserver.global.memstore.upperLimit其实这个参数的作用是防止内存占用过大,当ReigonServer内所有region的memstores所占用内存总和达到heap的40%时,HBase会强制block所有的更新并flush这些region以释放所有memstore占用的内存。这个公式是假设memstore达到最大值了,为了不发生上面的情况。 同upperLimit,只不过lowerLimit在所有region的memstores所占用内存达到Heap的35%时,不flush所有的memstore。它会找一个memstore内存占用最大的region,做个别flush,此时写更新还是会被block。lowerLimit算是一个在所有region强制flush导致性能降低前的补救措施。在日志中,表现为 “** Flush thread woke up with memory above low water.”
参数调整会影响读写,如果写的压力大导致经常超过这个阀值,则调小读缓存hfile.block.cache.size增大该阀值,或者Heap余量较多时,不修改读缓存大小。
如果在高压情况下,也没超过这个阀值,那么建议你适当调小这个阀值再做压测,确保触发次数不要太多,然后还有较多Heap余量的时候,调大hfile.block.cache.size提高读性能
参数调整会影响读写,(以下是经验之谈吧)如果写的压力大导致经常超过这个阀值,则调小读缓存hfile.block.cache.size,增大该阀值,或者Heap余量较多时,不修改读缓存大小。
如果在高压情况下,也没超过这个阀值,那么建议你适当调小这个阀值再做压测,确保触发次数不要太多,然后还有较多Heap余量的时候,调大hfile.block.cache.size提高读性能
hfile.block.cache.size表示storefile的读缓存占用Heap的大小百分比,0.2表示20%。该值直接影响数据读的性能。hbase.regionserver.global.memstore.upperLimit和这个参数一个影响写,一个影响读,如果两值加起来超过80-90%,会有OOM的风险。
2、Maximum region size
官方推荐maximum region size is 10-20Gb,5-10Gb is optimal.
0.98版本后加入了一些优化机制,可以使得region size 更大。