`
lc_koven
  • 浏览: 354084 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hbase中缓存的优先级

阅读更多
    今天同事问到hbase中in-memory属性的作用,以前没有注意过,今天仔细看了下代码:
      // Instantiate priority buckets
      BlockBucket bucketSingle = new BlockBucket(bytesToFree, blockSize,
          singleSize());
      BlockBucket bucketMulti = new BlockBucket(bytesToFree, blockSize,
          multiSize());
      BlockBucket bucketMemory = new BlockBucket(bytesToFree, blockSize,
          memorySize());

      // Scan entire map putting into appropriate buckets
      for(CachedBlock cachedBlock : map.values()) {
        switch(cachedBlock.getPriority()) {
          case SINGLE: {
            bucketSingle.add(cachedBlock);
            break;
          }
          case MULTI: {
            bucketMulti.add(cachedBlock);
            break;
          }
          case MEMORY: {
            bucketMemory.add(cachedBlock);
            break;
          }
        }
      }

      PriorityQueue<BlockBucket> bucketQueue =
        new PriorityQueue<BlockBucket>(3);

      bucketQueue.add(bucketSingle);
      bucketQueue.add(bucketMulti);
      bucketQueue.add(bucketMemory);

      int remainingBuckets = 3;
      long bytesFreed = 0;

      BlockBucket bucket;
      while((bucket = bucketQueue.poll()) != null) {
        long overflow = bucket.overflow();
        if(overflow > 0) {
          long bucketBytesToFree = Math.min(overflow,
            (bytesToFree - bytesFreed) / remainingBuckets);
          bytesFreed += bucket.free(bucketBytesToFree);
        }
        remainingBuckets--;
      }

    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的优先使用
分享到:
评论
4 楼 chenchao051 2012-08-08  
chenchao051 写道
请教个有个问题:
  public CachedBlock(BlockCacheKey cacheKey, Cacheable buf, long accessTime,
      boolean inMemory) {
    this.cacheKey = cacheKey;
    this.buf = buf;
    this.accessTime = accessTime;
    this.size = ClassSize.align(cacheKey.heapSize())
        + ClassSize.align(buf.heapSize()) + PER_BLOCK_OVERHEAD;
    if(inMemory) {
      this.priority = BlockPriority.MEMORY;
    } else {
      this.priority = BlockPriority.SINGLE;
    }
  }

按照这个说法,假如HBase中没有任何cf的in-memory是true,那么blockcache中25%的in-memory是否就这么被浪费了,我的实际使用过程中也差不多这个情况,一直是75%的占用。

今天再仔细看了下源代码,理解了。
3 楼 chenchao051 2012-08-06  
请教个有个问题:
  public CachedBlock(BlockCacheKey cacheKey, Cacheable buf, long accessTime,
      boolean inMemory) {
    this.cacheKey = cacheKey;
    this.buf = buf;
    this.accessTime = accessTime;
    this.size = ClassSize.align(cacheKey.heapSize())
        + ClassSize.align(buf.heapSize()) + PER_BLOCK_OVERHEAD;
    if(inMemory) {
      this.priority = BlockPriority.MEMORY;
    } else {
      this.priority = BlockPriority.SINGLE;
    }
  }

按照这个说法,假如HBase中没有任何cf的in-memory是true,那么blockcache中25%的in-memory是否就这么被浪费了,我的实际使用过程中也差不多这个情况,一直是75%的占用。
2 楼 lc_koven 2011-11-15  
xuqianghit 写道
“区别是在LRU淘汰数据时,single会优先淘汰,其次为multi,最后为memory。 ”?这个淘汰时应该是按照BlockBucket的compareTo方法来决定bucketQueue.poll()的结构吧,而BlockBucket的compareTo方法中是按照return this.overflow() > that.overflow() ? 1 : -1;比较的,那这样的话,就不是按照“single会优先淘汰,其次为multi,最后为memory”这种顺序了吧?

不知道是不是我的理解错误,谢谢。

恩,前面说的是一个近似的理解。实际上要根据overflow的结果来看。不过实际应用中single确实会比multi先淘汰,这是因为single进入更为频繁。
1 楼 xuqianghit 2011-11-14  
“区别是在LRU淘汰数据时,single会优先淘汰,其次为multi,最后为memory。 ”?这个淘汰时应该是按照BlockBucket的compareTo方法来决定bucketQueue.poll()的结构吧,而BlockBucket的compareTo方法中是按照return this.overflow() > that.overflow() ? 1 : -1;比较的,那这样的话,就不是按照“single会优先淘汰,其次为multi,最后为memory”这种顺序了吧?

不知道是不是我的理解错误,谢谢。

相关推荐

    大数据HBASE考题材料

    HBase中的行键按照二进制顺序进行排序,这种排序方式是从左到右逐字节比较的,这种方式确保了数据的高效检索和排序。 3. **HBase的数据存储基础** HBase构建在Hadoop的HDFS之上,这意味着HBase利用HDFS来存储其...

    Hbase运维手册范本.doc

    BlockCache 是 HBase 中的一种缓存机制,用于存储经常访问的数据。通过调整 BlockCache 的大小,可以提高 HBase 的读取性能。 3. 读写请求数 读写请求数是一个重要的性能指标,通过观察读写请求数,可以了解每台 ...

    HBase冷热分离技术方案.pdf

    冷数据则不进入缓存或者缓存优先级较低。 5. **混合存储架构**:采用如Intel Optane DC Persistent Memory等新型存储介质,构建混合存储架构,将热数据存储在高速内存中,冷数据保留在硬盘上,兼顾性能和成本。 ...

    HBase实践之MOB使用指南未翻译.pdf

    这需要在hbase-site.xml文件中的hbase.coprocessor.master.classes属性里添加相应的类名和优先级。 知识点三:MOB的管理 HBase 2.0+通过引入MOB特性,显著地改善了大规模对象数据的存储和处理性能。MOB的启用包括...

    hbase源码分析

    ### HBase源码分析 #### 一、HBase性能测试要点与分析 ##### 1.1 测试环境 ...以上是对HBase源码中Master启动过程的部分解析,这些步骤有助于理解HBase在启动时如何初始化Master组件,并准备接收客户端请求。

    林昊 HBase简介与实践分享 .pptx

    - **列族**(Column Family):HBase中的数据被组织在多个列族中,每个列族存储特定类型的数据。 - **单元格值**:存储在列族中的数据,通常以字节数组形式存储。 - **示例**:例如,一个表可能有用户信息列族和订单...

    Hbase运维手册.pdf

    BlockCache的三个优先级队列(Single、Multi、InMemory)分别对应不同访问频率的Block,以提高缓存利用率并降低Scan操作带来的影响。 综上所述,HBase的运维涉及多个层面,包括Region的管理和调整、缓存策略优化、...

    HBase源码分析

    - 从优先级队列中读取请求(Call),调用对应的Call方法获取响应值,并通过doRespond方法处理请求。 - 启动额外的Handler线程(默认为0)以优先处理高优先级任务。 5. **Zookeeper Watcher注册:** - 注册...

    HBase 数据库检索性能优化策略

    4. **时间戳(Timestamp)**:每个单元格可以有多个版本,不同版本的数据通过时间戳区分,最新版本的数据优先级最高。 5. **Region**:HBase将表水平分割成多个Region,每个Region负责一部分Rowkey范围内的数据。...

    大数据存储及分层实践-3-5 数帆数据中台大数据任务调度系统的实践.zip

    此外,为了提高数据访问效率,数据会被分层存储,例如,将热数据存放在高速缓存或内存中,而冷数据则存储在硬盘或者更低成本的存储介质上。这种分层存储策略可以有效平衡性能与成本。 在数帆数据中台,大数据存储...

    实战Flume基础

    Channel组件也支持Plugin扩展,支持事务和提供缓存队列功能,并且已经有MemoryChannel、FileChannel、JDBCChannel等多种实现。Sink组件同样支持Plugin扩展,有多种实现方式,如HDFS和HBase等。 Flume中的事务处理...

    各企业的大数据面试真题

    - **数据存储**: 存储 HBase 中的部分数据,提供快速检索的能力。 **性能考量**: - **查询峰值**: 根据业务需求确定 ES 的查询峰值。 - **服务器配置**: ES 的服务器配置需要根据数据量和查询频率来调整。 **与 ...

    大数据各类性能调优

    - 当Solr构建在HBase之上时,还需要考虑HBase的性能调优策略,以确保整个系统的高效运行。 ##### 12.8.4 Solr over HDFS调优建议 - 类似地,当Solr使用HDFS作为底层存储时,也需要注意HDFS的性能调优,以保证数据...

    flume的安装和实践.docx

    - **Sink**:负责将 Channel 中的数据发送到目的地,例如 HDFS、HBase 或其他日志存储系统。 2. **Flume 的启动命令** 使用 `bin/flume-ng agent` 命令启动 Flume,需要指定配置文件路径、Agent 名称以及日志级别...

    Hadoop就业面试宝典

    - **中间结果存储**: Spark将中间结果缓存在内存中,MapReduce则存储在磁盘上。 - **容错机制**: Spark通过RDD的血统机制自动恢复失败的任务。 9. **多线程使用**: - Java中的多线程编程主要通过`Thread`类或`...

    网路机器人java编程指南

    5. **算法设计**:网络抓取涉及到一系列算法,如深度优先搜索(DFS)、广度优先搜索(BFS),以及反向链接分析、PageRank算法等,用于决定抓取策略和优先级。 6. **数据存储**:抓取到的数据可能非常庞大,因此需要...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    优先级 引用 语言工具类库 容器类 集合 链表 map 工具类 系统类 日期类 数字类 字符串+正则 流 字符流 字节流 语言特性 继承 封装 多态 JVM 多线程与并发 GC机制 GC收集器类型 串行 CMS ...

    TiDB到底有什么用

    它的出现打破了Oracle、MySQL等非分布式设计数据库的局限,通过分层架构,使得缓存和数据库能分别处理各自擅长的业务场景。 在【标题】和【描述】中,我们可以看出TiDB的核心优势在于: 1. **弹性伸缩**:TiDB支持...

Global site tag (gtag.js) - Google Analytics