Performance HBase:为什么在达到块缓存的最大大小之前会有被逐出的块?
我目前使用的是ApacheHBase的库存配置,RegionServer堆为4G,块缓存大小为40%,大约为1.6G。未配置L2/BucketCache 以下是向RegionServer发出~2K请求后的块缓存指标。正如你所看到的,已经有街区被逐出,可能导致了一些失误 当我们还没有接近极限的时候,他们为什么被驱逐 大小2.1 M正在使用的块缓存的当前大小(字节) Free 1.5 G当前可用于存储更多缓存项的总可用内存(字节) 计算块缓存中的块数18 收回14个已收回的街区总数 收回1645收回发生的总次数 迁出时的平均10984块平均年限(秒) StdDev 5853922驱逐时街区年龄的标准偏差 命中1861对缓存命中的请求进行编号 Hits Caching 1854缓存命中块请求,但如果未命中,则仅将请求设置为缓存块 未命中58个块请求,这些请求是缓存未命中,但设置为缓存未命中的块 未命中缓存58个块请求,这些请求是缓存未命中,但仅请求设置为使用块缓存Performance HBase:为什么在达到块缓存的最大大小之前会有被逐出的块?,performance,hadoop,caching,hbase,Performance,Hadoop,Caching,Hbase,我目前使用的是ApacheHBase的库存配置,RegionServer堆为4G,块缓存大小为40%,大约为1.6G。未配置L2/BucketCache 以下是向RegionServer发出~2K请求后的块缓存指标。正如你所看到的,已经有街区被逐出,可能导致了一些失误 当我们还没有接近极限的时候,他们为什么被驱逐 大小2.1 M正在使用的块缓存的当前大小(字节) Free 1.5 G当前可用于存储更多缓存项的总可用内存(字节) 计算块缓存中的块数18 收回14个已收回的街区总数 收回1645收回
命中率96.98%命中计数除以总请求计数您看到的是LRU处理具有三个优先级的块的效果:单访问、多访问和内存中。对于默认的一级
LruBlockCache
类,其缓存份额可以设置为(括号中的默认值):
(25%)hbase.lru.blockcache.single.percentage
(50%)hbase.lru.blockcache.multi.percentage
(25%)hbase.lru.blockcache.memory.percentage
IN_MEMORY=true
,并将其优先级设置为IN MEMORY(显然)。对于单个访问块,如果另一个读访问请求相同的块,则将其标记为多访问优先级
LruBlockCache
有一个内部逐出线程,每10秒运行一次,并检查每个级别的块是否超过其允许的百分比。现在,如果您扫描一次较大的表,并假设缓存完全为空,则所有块都标记为单次访问。如果表的大小为1GB,则已将1GB加载到400MB缓存空间中,逐出线程将在适当的时候减少该空间。事实上,取决于扫描所用的时间,退出线程的10秒在扫描过程中重叠,一旦超过25%阈值,将开始退出块
逐出将首先从单访问区域逐出块,然后从多访问区域逐出块,最后,如果堆上仍然有压力,则从内存区域逐出块。这也是为什么您应该确保内存中标记列族的工作集不超过配置的缓存区域
你能做什么?如果您主要使用单访问块,则可以调整上述百分比,以便为LRU的单访问区域提供更多信息 我不太明白这一点,最初的问题是缓存方式中块的总大小低于任何单个、多个或内存限制。因此,即使他在系统运行时超过了这些限制中的一个,逐出线程是否只会将其降低到400MB或800MB限制中的一个?驱逐的数量很小,他可能从未达到这些限制中的任何一个。我在HBase 1.3.1系统中遇到了类似的问题,我试图理解为什么我们在缓存上看不到任何单个、多个或内存中的限制时会看到驱逐。我们确实启用了压缩,但从我读到的hbase.rs.executeBlocksOnClose默认值为false,我们没有覆盖它。@user2456600可能就是因为这个原因