转自: https://blog.csdn.net/wuwenxiang91322/article/details/51595771
Hbase内存磁盘关系
磁盘数 diskNum
磁盘容量 diskCapacity
备份数 replications
单个HFile文件大小 hbase.hregion.max.filesize
regions数 regions
diskNum*diskCapacity/replications =hbase.hregion.max.filesize *regions
注意
RegionServer维护Master分配给它的region,处理对这些region的IO请求,负责切分在运行过程中变得过大的region, 由于集群性能( 分配的内存和磁盘是有限的 )有限的,那么HBase单个RegionServer的region数目肯定是有上限的。
Region数目上限
RegionServer的region数目取决于memstore的内存使用,每个region拥有一组memstore(memstore的数量有hstore决定,hstore的数据由创建表时的指定的列族个数决定,所以 每个region的memstore的个数 = 表的列族的个数 ),可以通过配置来修改memstore占用内存的大小,一般设置在 128 M – 256M之间。
RegionServer 分配一定比例的内存给它下面的所有memstore( 该比例大小 可通过hbase.regionserver.global.memstore.upperLimit 进行修改 ), 如果内存溢出(使用了太多的memstore),它可能会导致严重的后果,如服务器反应迟钝 或compact风暴。比较好的计算每RS(假设一个表)region的数量的公式为:
((RS memory) * (total memstore fraction)) / ((memstore size)*(# column families))
例如: 如果 一个RegionServer配置的内存是16g,使用默认配置( hbase默认regionserver分给memstore的比例是0.4 , 默认的menstore的占用128M内存 ), 一个CF,那么这个regionServer下的region的个数大约为 16384 * 0.4 / (128*1) = 51个,实际测试大于这个数 一两倍 也没太大的问题。 一个HBase表包含一至多个region,那么表的数目上限也是可以估算出来的。每台 RegionServer 管理 1000 个左右 Regions 效果最好。
HBase存储原理
Hbase底层使用HFile存储数据,HFile最小存储单元Block,HFile物理存放形式是一个Block的序列外加这些HBase的索引。这意味着,从Hbase里读取一个Block需要在索引上查找一次该Block然后从磁盘读取数据。Block是建立索引的最小数据单元,也是从磁盘读取的最小数据单元,Block大小可以在列簇设定,默认64KB。如果主要用于随机查询,可能需要细粒度的Block索引,小一点的Block更好些。Block变小会导致索引变大,进而消耗更多内存,如果需要经常顺序扫描,一次读取多个Block,大一点的Block效果更好,Block变大索引项变小,索引变小,节省内存