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的优先使用

posted on 2013-11-25 12:40  代码王子  阅读(117)  评论(0编辑  收藏  举报

导航