美文网首页
如何评估HBASE RegionServer的大小

如何评估HBASE RegionServer的大小

作者: 海边的贝壳林 | 来源:发表于2019-10-25 10:16 被阅读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版本的默认值):

    • RegionSize: 10GB regions
    • MemstoreSize: 128MB memstores
    • ReplicationFactor: HDFS replication factor of 3
    • HeapFractionForMemstores: 40% of the heap use for the memstores

    结果: 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介绍

    相关文章

      网友评论

          本文标题:如何评估HBASE RegionServer的大小

          本文链接:https://www.haomeiwen.com/subject/wiqjvctx.html