1. Physical data size
Ganglia监控disk存储状态
2. JVM GC Lmitations
考虑到GC问题,RS的max heap size一般推荐设置为16GB左右
3. Region count & size
估算region数量的Formula:
(RS memory)*(total memstore fraction)/((memstore size)*(# column families))
比如: 一个RS 有16GB Mem, memstore fraction 0.4 , memstore max size 128MB
16GB * 0.4/(128MB) 约等于 51 regions。 对于存储了多个表,column families值为所有families个数的总和。
但是,一般情况下,memstore的存储空间是没有打满的,所以一个RS对regions的容量可以是公式计算值的2-3倍.
在hbase官方book-9.7.1.1节,一个RS最好维护大约100个regions,理由是:
1> 每个memstore 的MSLAB需要2MB。假设一个RS有1000个regions,每个region有两
个CF, MSLAB就要占用4GB左右的Mem, 这些Mem没有存任何数据.
2> 一个RS如果有太多的regions,比如1000 那么总的memstore size很容易超过设置的阈值,这样会造成大量tiny flush,即形成很多size 很小的storefiles,导致大量的compactions发生。
3> RS上regions数量太多,那么RS宕机恢复时,master reassgin them需要很长的时间.
4> 一个RS上有太多的regions,相应的index也会增多,占用的Mem也会增加。
当然,数据很多,但是region数量很少也不能达到很好读写效果。
Region max size:
Region max size受限于compact,因为size 太大,major compact将会占用过多的时间,影响读写性能。推荐的max size: 10GB-20GB。
4. Total data size per RS
根据上面的数据,一个RS能够存储的数据size 大约为 (10GB~20GB) * 100 即1TB到2TB左右。 当然,考虑到blockcache size最大设置10GB时,cache data才占总数据的1%, 为了有更好的读性能, 那么可是适当减少存储的数据。
5. compact & split
HBase 优化必须考虑的两点:
split policy:
- ConstantSizeRegionSplitPolicy
当region size达到hbase.hregion.max.filesize时,region split为两个。推荐:hbase.hregion.max.filesize = 10~20GB,减少split对读写的影响。
- IncreasingToUpperBoundRegionSplitPolicy
hbase 默认配置,region split on region size arrive at Min (R^2 * “hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”), R is current num of regions.
比如现在,max.filesize is 10GB, flush.size is 128MB.
Split 将会发生在 region size 为 :
min( 1^2*128MB , 10GB ) = 128MB
min( 2^2*128MB , 10GB ) = 512MB
min( 3^2*128MB , 10GB ) = 1152MB
min( 4^2*128MB , 10GB ) = 2GB
min( 5^2*128MB , 10GB ) = 3.2GB
……
不推荐使用。
- KeyPrefixRegionSplitPolicy
基本理解是有相同prefix 的rowkey split时 放在一个region里。
Compact:
minor compact: 根据算法选取需要compact 的storefiles
major compact: 将region store里的storefiles 合并为一个文件
推荐配置:开启minor compact, 关闭major compact 设为定时执行
6. Read/Write throughput
need ycsb test, see later...