我目前使用的是Apache HBase的常规配置,RegionServer堆的大小为4G,BlockCache的大小为40%,因此大约为1.6G。未配置L2 / BucketCache。

这是向RegionServer请求约2K后的BlockCache指标。如您所见,已经逐出了障碍物,可能导致了一些失误。

为什么我们甚至还没有达到极限,他们就被驱逐了?

大小2.1 M当前正在使用的块缓存的大小(字节)

可用1.5 G当前可用于存储更多缓存条目的总可用内存(字节)

计数18块缓存中的块数

驱逐14驱逐的总区块数

驱逐1,645驱逐的总次数

驱逐时间平均10,984块的平均年龄(秒)

StdDev 5,853,922逐出时砖块年龄的标准偏差

命中次数1,861高速缓存命中的请求数

命中缓存1,854缓存命中块请求,但只有未命中的请求才会设置为缓存块

未命中58个块请求,这些请求是缓存未命中,但设置为缓存未命中的块

Misses Caching 58缓存未命中的阻止请求,但仅设置为使用块缓存的请求

命中率96.98%命中数除以请求总数

最佳答案

您将看到LRU处理具有三个优先级级别的块的效果:单次访问,​​多次访问和内存中。对于默认的L1 LruBlockCache类,它们的缓存份额可以使用(括号中的默认值)设置:

  • hbase.lru.blockcache.single.percentage(25%)
  • hbase.lru.blockcache.multi.percentage(50%)
  • hbase.lru.blockcache.memory.percentage(25%)

  • 对于4 GB的堆示例,并为缓存留出40%的空间,您有1.6 GB的堆,根据上述百分比,每个优先级还分为400 MB,800 MB和400 MB。

    从存储中加载块时,通常将其标记为单次访问,​​除非已将其所属的列族配置为IN_MEMORY = true,并将其优先级设置为内存中(显然)。对于单访问块,如果另一个读取访问请求同一块,则将其标记为多访问优先级。
    LruBlockCache具有一个内部驱逐线程,该驱逐线程每10秒运行一次,并检查每个级别的块是否一起超过其允许的百分比。现在,如果您扫描一个更大的表一次,并且假定缓存完全为空,则所有块都被标记为单次访问。如果表的大小为1 GB,则已将1 GB加载到400 MB的缓存空间中,随后逐出线程将减少该逐出线程。实际上,取决于扫描所花费的时间,驱逐线程的10秒会在扫描过程中消失,一旦超过25%阈值,就会开始逐出块。

    逐出将首先从单访问区撤出块,然后从多访问区撤出块,最后,如果堆上仍然有压力,则从内存区撤出。这就是为什么您应该确保内存中标记列系列的工作集没有超出配置的缓存区域的原因。

    你能做什么?如果您主要是单次访问块,则可以调整以上百分比,以将更多的空间分配给LRU的单次访问区域。

    09-10 08:20