如何评估HBASE RegionServer的大小

2019-10-25  本文已影响0人  海边的贝壳林

给HBase调整机器的大小有点像一种黑色魔法。
与只针对磁盘大小和吞吐量进行优化的纯存储机器不同,HBase RegionServer还是一个计算节点。
磁盘上每一字节的空间都要与少量RegionServer的堆内存空间相匹配.
你可以通过下面的公式来评估磁盘空间对应的堆内存的比率:
\frac{RegionSize}{MemstoreSize} * ReplicationFactor * HeapFractionForMemstores
或者使用HBase/HDFS配置参数的形式:
\frac{regions.hbase.hregion.max.filesize}{hbase.hregion.memstore.flush.size} * dfs.replication * hbase.regionserver.global.memstore.lowerLimit

假设你有下面几个参数(这是0.94版本的默认值):

结果: 10GB/128MB*3*0.4 = 96.

译者注:


计算结果

现在想想, 使用默认设置, 意味着如果想为每个RegionServer提供10TB的存储空间, 对应需要107GB的Java堆内存!
或者, 如果你给一个RegionServer 10GB的堆内存, 你只能在每个RegionServer机器上得到1T的磁盘空间.

这是超越了很多人的常识的.

我们再回顾一下:

为了使用10T的原始磁盘空间 - 在3个备份的情况下, 实际可用空间为3.3T - 对于10GB的region, 你需要大约338个region. @128MB that's about 43GB. 但是默认情况下 仅仅只有40%用于memstore, 所以你实际需要的内存是 43GB \div 0.4 ≈107GB. Yep , 没错.

或许我们可以稍稍做一个假设: 并不是任何时候所有的memstore都是100%满额使用的. 这可以通过下面的事实以抵消: 并不是所有的region都是相同的或者100%被满额使用的.

那么现在, 你能做什么?

这里有一些选项:

  1. 增加region的大小, 20GB是最大的容量, 尽管有些人声称他们有200GB的region.(hbase.hregion.max.filesize)
  2. 减少memstore的大小. 根据写入负载的大小你可以调整小一些, 64MB甚至更小. (hbase.hregion.memstore.flush.size)
    你可以通过配置下面这个参数, 允许memstore临时性地的超过这个大小. (hbase.hregion.memstore.block.multiplier)
  3. 增加HDFS的副本因数(replication factor), 这本身并没有什么帮助, 但是你有过有超过实际需要的空间的话, 增加这个副本因数可以至少可以更好用好你的磁盘.
  4. 略微改动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大小.

  1. hbase.regionserver.hlog.blocksize, defaults to the HDFS block size
  2. hbase.regionserver.logroll.multiplier, defaults to 0.95
  3. 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

参考:

  1. HBase region server memory sizing
  2. 大数据技术-HBase:MSLAB介绍
上一篇下一篇

猜你喜欢

热点阅读