hbase:为什么在达到blockcache的最大大小之前会有被逐出的块?

uttx8gqw  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(367)

我目前使用的是apachehbase的库存配置,regionserver heap为4g,blockcache大小为40%,大约为1.6g。未配置l2/bucketcache。
以下是向regionserver发出~2k个请求后的块缓存度量。正如你所看到的,已经有街区被逐出,可能导致了一些遗漏。
为什么他们在我们还没接近极限的时候就被驱逐?
大小2.1 m正在使用的块缓存的当前大小(字节)
free 1.5 g当前可用于存储更多缓存项的总可用内存(字节)
计算块缓存中的块数
驱逐14个被驱逐的街区总数
逐出1645逐出发生的总次数
搬迁时平均10984个街区的平均年限(秒)
stddev 5853922驱逐时街区年龄的标准偏差
hits 1861缓存命中的请求数
hits caching 1854缓存命中块请求,但仅在未命中时将请求设置为缓存块
未命中58个为缓存未命中但设置为缓存未命中块的块请求
未命中缓存58个块请求,这些请求是缓存未命中,但只有设置为使用块缓存的请求
命中率96.98%命中率除以总请求数

ohfgkhjo

ohfgkhjo1#

您看到的是lru处理具有三个优先级级别的块的效果:单访问、多访问和内存中。对于默认l1 LruBlockCache 类,它们在缓存中的份额可以设置为(括号中的默认值): hbase.lru.blockcache.single.percentage (25%) hbase.lru.blockcache.multi.percentage (50%) hbase.lru.blockcache.memory.percentage (25%)
以4gb堆为例,为缓存预留40%的空间,您有1.6gb堆,根据上述百分比,每个优先级进一步划分为400mb、800mb和400mb。
从存储器加载块时,通常将其标记为单次访问,除非它所属的列族已配置为 IN_MEMORY = true ,将其优先级设置为内存中(显然)。对于单个访问块,如果另一个读访问请求相同的块,则将其标记为多访问优先级。
这个 LruBlockCache 有一个内部逐出线程,每10秒运行一次,检查每个级别的块是否超过了允许的百分比。现在,如果您扫描一次较大的表,并且假设缓存是完全空的,那么所有的块都被标记为single access。如果表的大小为1GB,则已将1GB加载到400MB缓存空间中,然后逐出线程将在适当的时候减少该空间。事实上,根据扫描所用的时间,10秒的逐出线程在扫描期间重叠,一旦超过25%的阈值,就会开始逐出块。
逐出将首先从单访问区域逐出块,然后从多访问区域逐出块,最后,如果堆上仍有压力,则从内存区域逐出块。这也是为什么您应该确保内存中标记的列族的工作集不超过配置的缓存区域。
你能做什么?如果您主要使用单访问块,则可以调整上述百分比,以使lru的单访问区域更大。

相关问题