zoukankan      html  css  js  c++  java
  • HBase中缓存的优先级

    ava代码  收藏代码
    1. // Instantiate priority buckets  
    2. BlockBucket bucketSingle = new BlockBucket(bytesToFree, blockSize,  
    3.     singleSize());  
    4. BlockBucket bucketMulti = new BlockBucket(bytesToFree, blockSize,  
    5.     multiSize());  
    6. BlockBucket bucketMemory = new BlockBucket(bytesToFree, blockSize,  
    7.     memorySize());  
    8.   
    9. // Scan entire map putting into appropriate buckets  
    10. for(CachedBlock cachedBlock : map.values()) {  
    11.   switch(cachedBlock.getPriority()) {  
    12.     case SINGLE: {  
    13.       bucketSingle.add(cachedBlock);  
    14.       break;  
    15.     }  
    16.     case MULTI: {  
    17.       bucketMulti.add(cachedBlock);  
    18.       break;  
    19.     }  
    20.     case MEMORY: {  
    21.       bucketMemory.add(cachedBlock);  
    22.       break;  
    23.     }  
    24.   }  
    25. }  
    26.   
    27. PriorityQueue<BlockBucket> bucketQueue =  
    28.   new PriorityQueue<BlockBucket>(3);  
    29.   
    30. bucketQueue.add(bucketSingle);  
    31. bucketQueue.add(bucketMulti);  
    32. bucketQueue.add(bucketMemory);  
    33.   
    34. int remainingBuckets = 3;  
    35. long bytesFreed = 0;  
    36.   
    37. BlockBucket bucket;  
    38. while((bucket = bucketQueue.poll()) != null) {  
    39.   long overflow = bucket.overflow();  
    40.   if(overflow > 0) {  
    41.     long bucketBytesToFree = Math.min(overflow,  
    42.       (bytesToFree - bytesFreed) / remainingBuckets);  
    43.     bytesFreed += bucket.free(bucketBytesToFree);  
    44.   }  
    45.   remainingBuckets--;  
    46. }  

        hbase内部的blockcache分三个队列:single、multi以及memory,分别占用25%,50%,25%的大小。这涉及到family属性中的in-memory选项,默认是false。
        设为false的话,第一次访问到该数据时,会将它写入single队列,否则写入memory队列。当再次访问该数据并且在single中读到了该数据时,single会升级为multi
        这三个队列其实是在共用blockcache的资源,区别是在LRU淘汰数据时,single会优先淘汰,其次为multi,最后为memory。

        所以结论有两点:
        1 同一个family不会占用全部的blockcache资源
        2 当某些family特别重要时,可以将它的in-memory设为true,单独使用一个缓存队列,保证cache的优先使用
  • 相关阅读:
    自我知识管理
    目标管理
    产品经理的时间与情绪管理
    leetcode 88.合并两个有序数组(双指针 java)
    leetcode 680.验证回文字符串 II(双指针 java)
    leetcode 345.反转字符串中的元音字母(双指针 java)(有地方不懂)
    leetcode 633.平方数之和(双指针 java)
    leetcode167. 两数之和 II
    LeetCode 66. 加一(java)
    LeetCode 58. 最后一个单词的长度 (java)
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205185.html
Copyright © 2011-2022 走看看