给HBase调整机器的大小有点像一种黑色魔法。
与只针对磁盘大小和吞吐量进行优化的纯存储机器不同,HBase RegionServer还是一个计算节点。
磁盘上每一字节的空间都要与少量RegionServer的堆内存空间相匹配.
你可以通过下面的公式来评估磁盘空间对应的堆内存的比率:
或者使用HBase/HDFS
配置参数的形式:
假设你有下面几个参数(这是0.94版本的默认值):
-
RegionSize
: 10GB regions -
MemstoreSize
: 128MB memstores -
ReplicationFactor
: HDFS replication factor of 3 -
HeapFractionForMemstores
: 40% of the heap use for the memstores
结果:
译者注:
计算结果
现在想想, 使用默认设置, 意味着如果想为每个RegionServer提供10TB的存储空间, 对应需要107GB的Java堆内存!
或者, 如果你给一个RegionServer 10GB的堆内存, 你只能在每个RegionServer机器上得到1T的磁盘空间.
这是超越了很多人的常识的.
我们再回顾一下:
为了使用10T的原始磁盘空间 - 在3个备份的情况下, 实际可用空间为3.3T - 对于10GB的region, 你需要大约338个region. @128MB that's about 43GB
. 但是默认情况下 仅仅只有40%用于memstore, 所以你实际需要的内存是 . Yep , 没错.
或许我们可以稍稍做一个假设: 并不是任何时候所有的memstore
都是100%满额使用的. 这可以通过下面的事实以抵消: 并不是所有的region都是相同的或者100%被满额使用的.
那么现在, 你能做什么?
这里有一些选项:
- 增加region的大小, 20GB是最大的容量, 尽管有些人声称他们有200GB的region.
(hbase.hregion.max.filesize)
- 减少memstore的大小. 根据写入负载的大小你可以调整小一些, 64MB甚至更小.
(hbase.hregion.memstore.flush.size)
你可以通过配置下面这个参数, 允许memstore临时性地的超过这个大小.(hbase.hregion.memstore.block.multiplier)
- 增加HDFS的副本因数(replication factor), 这本身并没有什么帮助, 但是你有过有超过实际需要的空间的话, 增加这个副本因数可以至少可以更好用好你的磁盘.
- 略微改动memstore占用的堆内存因数. 如果你写负载较高, 堆的占用率可以调到50%以上.
hbase.regionserver.global.memstore.upperLimit, hbase.regionserver.global.memstore.lowerLimit
这些参数(除了配置在HDFS的副本参数)都是配置在HBASE的hbase-default.xml文件里的.
就我个人而言, 我会让HBASE的每台机器能够提供的空间不超过6T, 除非你有非常重的读操作.
所以, Java堆应该是32GB (20G regions, 128M memstores, 其余的默认值). 与MSLAB在0.94正常工作。
当然, 你的需求可能有所不同. 你或许有大量的读负载, 这种的话, 你可以缩小memstore(的内存占用, 译者注). 或者磁盘空间可以与其他应用共享.
也许你需要更小的region或者更大的memstore. 这种情况下, 你能更少的为每台机器提供的最大磁盘空间.
未来JVM将会有效地支持大堆内存(我想到了JDK7的G1)
目前已经实现. 译者注.
综合各种情况下, 上面的公式提供了一个很好的切入点.
更新日期:2013年6月10日星期一
Kevin O'dell在邮件列表里指出, WAL总量应该与memstore总量相匹配. 所以这个更新增加上述总量的考虑点.
HBASE使用三个参数去明确每个RegionServer的HLog大小.
- hbase.regionserver.hlog.blocksize, defaults to the HDFS block size
- hbase.regionserver.logroll.multiplier, defaults to 0.95
- hbase.regionserver.maxlogs, default: 32
因此, 针对HDFS 64MB的块大小, HLog不能超过2GB.
hbase.regionserver.global.memstore.lowerLimit <= hbase.regionserver.hlog.blocksize * hbase.regionserver.logroll.multiplier * hbase.regionserver.maxlogs
image.png
网友评论