大发幸运飞艇_大发幸运飞艇官网

hbase源码系列(十三)缓存机制MemStore与Block Cache

时间:2020-01-23 08:05:27 出处:大发幸运飞艇_大发幸运飞艇官网

搞了二个 优先级队列,先从SINGLE的开刀、SINGLE不行了,再拿MULTI开刀,最后是MEMORY。bytesToFree是完后 计算好的,要释放的大小=当前值-最小值。

这里大伙儿儿看这俩句就上都可以 了ioEngine.write(sliceBuf, offset);  在写入ioEngine的完后 是要传这俩offset的,也正好验证了我完后 的想法,过多有BucketAllocator.allocateBlock的分配管理这块就很关键了。

这里完后 百度的二个 哥么问我,Meta表的块会不需要老会 被保位于MEMORY当中呢,这块的代码写得让他不得劲儿沮丧的,它是按照列族的参数设置的,而是我缘何去找Meta表的列族设置啊,啊被我找到了,在代码底下写着的。

这俩章讲hbase的缓存机制,这底下涉及的内容也是比较多,呵呵,我理解中的缓存是保位于内存中的特定的便于检索的数据价值形式而是缓存。

它们的排序规则上一章完后 说过了,排过序的在搜索的完后 方便查找,这里为那先 还二个 snapshot呢?snapshot是二个 和它一样的东西,大伙儿儿都知道MemStore是要flush到文件生成StoreFile的,而是不都可以 写文件的完后 让别人都这麼读了吧,那缘何办,先把它拷贝到snapshot当中,这俩时间很短,复制完了就上都可以 访问kvset,实际flush的完后 ,大伙儿儿flush掉snapshot当中的kv就上都可以 啦。

这里缘何又来了二个 ,二个 内存的,二个 后备队里的,这俩是有区别的RAMQueueEntry当中直接保存了块的buffer数据,BucketEntry而是保存了起始位置和长度。

大伙儿儿看看这俩WriterThread的run土办法吧。

MemStore底下二个 有序的集合,kvset和snapshot,KeyValueSkipListSet的实物实现是ConcurrentNavigableMap。

而是们继续讲讲这俩MemStoreChunkPool吧,它默认是不被开启的,完后 它的参数hbase.hregion.memstore.chunkpool.maxsize默认是0 (只允许输入0->1的数值),它是通过堆内存的最大值*比例来计算得出来的结果。

完后 offHeapCacheSize <= 0,就走下面的逻辑,这里让他简单陈述一下了,代码没啥可贴的。

这里大伙儿儿主要关注的是LruBlockCache和BucketCache,至于大伙儿儿的使用,请参照底下的博客设置,这里不再介绍哦。

再吐槽一下hbase这俩Lru算法吧,做得挺粗糙的,它记录了每个Block块的访问次数,而是它并这麼按照这俩来排序,而是简单的依赖哈希值来排序。

在把block剔除出内存完后 ,就把块加到victimHandler底下,这俩victimHandler而是BucketCache,在CacheConfig实例化LruBlockCache完后 就用setVictimCache土办法传进去的。

上都可以 看出来Meta表的块不都可以 8K,常驻内存,不使用BloomFilter,允许集群间复制。

那它和Region Server、Region是那先 关系?

BucketSizeInfo是负责管理那先 Bucket的,它管理着五个队列,一同它上都可以 动态根据需求,new一点新的不同大小的Bucket出来,也上都可以 把现有的Bucket变更它的大小,Bucket的大小最小是5K,最大是513K。

CacheConf是针对HFileBlock的缓存,专门用来缓存快,默认是在读的完后 缓存块,也上都可以 修改列族的参数,让它在写的完后 也缓存,这俩在数据模型定义的完后 提到过。

MemStore的内存最大最小值分别是0.35 --> 0.4,这俩在我完后 的博客底下都在。

分配完Chunk完后 ,干的是这俩函数,而是加在到二个 有序集合当中kvset。

memstore比较有意思,大伙儿儿先看它的add土办法,这俩是入口。

它上都可以 承受的最大的Chunk的数量是这麼计算的 MaxCount = MemStore内存限制 * Chunkpool.Maxsize / Chunksize。

offHeapCacheSize =offheapcache.percentage * DirectMemorySize

MemStore是存储着二个 有序的kv集合,kv进来先写到底下,超过阀值完后 就会写入硬盘。

大伙儿儿是都在上都可以 这麼理解:而是当大伙儿儿不还要某个块的完后 大伙儿儿不需要去物理的删除它,只还要不断的重用它底下的空间就上都可以 了,而不还要管缘何删除、释放等相关内容。

2、ioEngine同步,ioEngine包括3种(file,offheap,heap),第一种而是写入SSD,用的是FileChannel,后一种是写入到二个 ByteBufferArray

 先从map中取,完后 找不都可以 就从victimHandler中取得。

Tips:江湖传言二个 Regionserver上二个 BlockCache和N个Memstore,它们的大小之和不都可以 大于等于heapsize * 0.8,而是HBase不都可以 正常启动,想想也是,hbase是内存大户,内存稍有不足英文就挂掉,大伙儿儿要小心设置这俩缓存的参数。

sizeIndex是啥意思?是在BucketSizeInfo的数组底下的位置,它的大小都在有固定的值的,不都可以 多而是能少,这里就不全部介绍了。大伙儿儿直接看WriteToCache这俩土办法吧,好验证一下完后 的想法。

而是们要关注的而是doDrain的土办法了,在这俩土办法底下,它主要干了4件事情。

4、完后 空间不足英文一句话,调用freeSpace清理空间,清理空间的土办法和LruBlockCache的土办法累似 。

这里大伙儿儿还真不都可以 设置它,完后 完后 设置了它一句话,它会把new二个 DoubleCache出来,它是LruBlockCache和SlabCache的合体,完后 我提到的那篇文章底下说到SlabCache是二个 不都可以 存固定大小的Block大小的Cache,比较垃圾。

这里还分堆上内存和直接分配的内存,堆上的内存的参数hfile.block.cache.size默认是0.25。

在LruBlockCache当中还分了一种优先级的缓存块,分别是SINGLE、MULTI、MEMORY,比列分别是0.25、0.5、0.25,当快要满的完后 ,要把块剔除出内存的完后 ,就要遍历所有的块了,而是计算大伙儿儿的分别占的比例,剔除的代码还挺有意思。

下面大伙儿儿看看这俩流程吧,还是老规矩,先看入口,再看出口,入口在哪里,前面的代码中提到了,入口在cacheBlockWithWait土办法。

不管缘何样吧,把多个小的kv写到二个 连续的数组底下完后 是好点好处吧,下面讲一下它的相关参数吧。

在大伙儿儿设置列族参数的完后 ,二个 InMemory的参数,完后 设置了它而是MEMORY,完后 没设置,而是SINGLE,SINGLE类型的一旦被访问过完后 ,立马变成高富帅的MULTI,而是这麼希望变成MEMORY。

还有这俩参数hbase.hregion.memstore.chunkpool.initialsize还要设置,默认又是0,输入0->1的数值,MaxCount乘以它就设置初始的Chunk大小。

大伙儿儿上都可以 从二个 土办法底下看LruBlockCache和BucketCache的关系,二个 是getBlock,二个 是evictBlock,先看evictBlock。

Region Server下面有若干个Region,每个Region下面有若干的列族,每个列族对应着二个 HStore。

而是这块的图在底下的那篇文章完后 提到了,让他不再重复了,完后 没看的请一定要看,那边有很全部的图解,我这里而是讲点我了解的实现。

在看这俩完后 ,先推荐看一下我的另外一篇文章《缓存机制以及上都可以 利用SSD作为存储的BucketCache》,而是底下有过多有概念,你看不懂的。

上都可以 看得出来在这俩土办法当中,先把块写入到ramCache当中,而是再插入到二个 随机的写入队列,写入程序池有五个,每个写入程序池持二个 写入队列,程序池的数量由参数hbase.bucketcache.writer.threads控制。

没试过开启这俩Pool效果是否是 会好,它是依附在MemStore底下的,它设置过大了,最直接的影响而是,另外二个 集合的空间就小了。

StoreEngine是StoreFile的管理器,它管理着这俩列族对应的所有StoreFiles。

从底下二个 土办法,大伙儿儿上都可以 看出来BucketCache是LruBlockCache的二级缓存,它无须了才会存到BucketCache当中,取得完后 也是,找不都可以 了才想起人家来。

1、把ramCache当中的实体给剔除出来转加在BucketEntry,并切入到ioEngine。

HStore底下二个 不得劲要的类,在这章的内容回会 提到。

好,大伙儿儿现在进入到BucketCache底下看看,它底下哪几个重要的属性。

先看maybeCloneWithAllocator,大伙儿儿慢慢看,没关系。

这底下的Bucket它而是是二个 具体的东西,它底下记住的也是起始位置,使用了哪几个次的那先 参数,过多有说它是二个 逻辑上的,而都在物理上的分配的一块随机的地址。

好吧,大伙儿儿现在清楚了,它是给每个kv的数据又重新找了个地方混,从注释底下讲这俩Chunk未初始化,这麼被分配内存,过多有开销小。不太理解这俩东西,人家完后 也是在byte数组底下混,只不顾挪了个窝了,莫非是为了减少内存碎片?尼玛,还真被是我不好中了,在我完后 的资料底下有《调优》。

不管如保,BlockCache这块的总大小是固定的,是由这俩参数决定hfile.block.cache.size,默认它是0.25,过多有LruBlockCache最大也而是0.25的最大堆内存。

都看这俩大伙儿儿再看getBlock。

关于缘何分配这块,还是留个能人讲吧,我是讲不好了。

3、把BucketEntry加在到backingMap

完后 在讲put的完后 ,put是被加在到Store底下,这俩Store是个接口,实现是在HStore底下,MemStore嘴笨 是它底下的小子。

CacheConfig是二个 HStore二个 ,属性是根据列族定制的,比如是否是 常驻内存,而是它内存用来缓存块的BlockCache是Region Server全局共享的的globalBlockCache,在new二个 CacheConfig的完后 ,它会调用instantiateBlockCache土办法返回二个 BlockCache缓存Block的,完后 完后 位于globalBlockCache,就直接返回,这麼才会重新实例化二个 globalBlockCache。

先把kv放满去maybeCloneWithAllocator底下复制出来二个 新的kv,而是再走internalAdd的土办法,缘何要这麼搞呢?

直接分配的内存,要通过设置JVM参数-XX:MaxDirectMemorySize来设置,设置了这俩完后 大伙儿儿还还要设置hbase.offheapcache.percentage(默认是0)来设置占直接分配内存的比例。

LruBlockCache和BucketCache的媒体媒体合作一种,一种是BucketCache作为二级缓存使用,比如SSD,一种是在内存当中,它俩各占比列0.1和0.9,还是建议上SSD做二级缓存,嘴笨 而是贵。

热门

热门标签