`
wx1569578408
  • 浏览: 71509 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

hbase 学习(十五)缓存机制以及可以利用SSD作为存储的BucketCache

 
阅读更多

下面介绍Hbase的缓存机制: 
  a.HBase在读取时,会以Block为单位进行cache,用来提升读的性能

  b.Block可以分类为DataBlock(默认大小64K,存储KV)、BloomBlock(默认大小128K,存储BloomFilter数据)、IndexBlock(默认大小128K,索引数据,用来加快Rowkey所在DataBlock的定位)

  c.对于一次随机读,Block的访问顺序为BloomBlock、IndexBlock、DataBlock,如果Region下面的StoreFile数目为2个,那么一次随机读至少访问2次BloomBlock+1次IndexBlock+1次DataBlock

  d.我们通常将BloomBlock和IndexBlock统称为MetaBlock,MetaBlock线上系统中基本命中率都是100%

  e.Block的cache命中率对HBase的读性能影响十分大,所以DataBlockEncoding将KV在内存中进行压缩,对于单行多列和Row相似的场景,可以提高内存使用率,增加读性能

  f.HBase中管理缓存的Block的类为BlockCache,其实现目前主要是下面三种,下面将着重介绍这三类Cache 

1、LruBlockCache

  默认的BlockCache实现,也是目前使用的BlockCache,使用一个HashMap维护Block Key到Block的映射,采用严格的LRU算法来淘汰Block,初始化时会指定容量大小,当使用量达到85%的时候开始淘汰block至75%的比例。 

  优点:直接采用jvm提供的HashMap来管理Cache,简单可依赖;内存用多少占多少,JVM会帮你回收淘汰的BlOCK占用的内存 

  缺点: 

  (1)一个Block从被缓存至被淘汰,基本就伴随着Heap中的位置从New区晋升到Old区 
  (2)晋升在Old区的Block被淘汰后,最终由CMS进行垃圾回收,随之带来的是Heap碎片 
  (3)因为碎片问题,随之而来的是GC时晋升失败的FullGC,我们的线上系统根据不同的业务特点,因为这个而发生FullGC的频率,有1天的,1周的,1月半年的都有。对于高频率的,在运维上通过在半夜手工触发FullGC来缓解
  (4)如果缓存的速度比淘汰的速度快,很不幸,现在的代码有OOM的风险(这个可以修改下代码避免) 

2、SlabCache

  针对LruBlockCache的碎片问题一种解决方案,使用堆外内存,处于实验性质,真实测试后,我们定位为不可用。说下它的原理:它由多个SingleSizeCache组成(所谓SingleSizeCache,就是只缓存固定大小的block,其内部维护一个ByteBuffer List,每个ByteBuffer的空间都是一样的,比如64K的SingleSizeCache,ByteBuffer的空间都是64K,cache Block时把Block的内容复制到ByteBuffer中,所以block的大小必须小于等于64K才能被这个SingleSizeCache缓存;淘汰block的时候只需要将相应的ByteBuffer标记为空闲,下次cache的时候对其上的内存直接进行覆盖就行了),cache Block的时候,选择一个小于且最接近的SingleSizeCache进行缓存,淘汰block亦此。由于SingleSize的局限性,其使用上和LruBlockCache搭配使用,叫做DoubleBlockCache,cache block的时候LruBlockCache和SlabCache都缓存一份,get block的时候顺序为LruBlockCache、SlabCache如果只有SlabCache命中,那么再将block缓存到LruBlockCache中(本人觉得它的这个设计很费,你觉得呢) 

  优点:其思想:申请固定内存空间,Block的读写都在这片区域中进行 
  缺点:

  (1)cache block和 get block的时候,需要内存复制 
  (2)SingleSizeCache的设计,导致内存使用率很低 
  (3)与LruBlockCache搭配使用不合理,导致所有的block都会去LruBlockCache中逗留一下,结果是CMS和碎片都不能有所改善

3、 BucketCache

  可以看成是对SlabCache思想在实现上的一种改进及功能扩展,其优点是解决LruBlockCache的缺点及支持面向高性能读的大缓存空间,下面将着重介绍它的功效
  3.1 何谓大缓存?

  缓存Block的存储介质不再仅仅依赖在内存上,而是可以选择为Fusion-io、SSD等高速磁盘,我们称之为二级缓存

  3.2 何谓Bucket?

  我们将缓存空间划分为一个个的Bucket,每个Bucket都贴上一个size标签,将Block缓存在最接近且小于size的bucket中(和SingleSizeCache很相似)

  3.3 怎么解决CMS 碎片问题?

  Block存储在Bucket中,而每个Bucket的物理存储是不变的,也就是说系统刚启动的时候,我们就申请了一堆Bucket内存空间,而这些内存空间是一直在Old区,block的Get/Cache动作只是对这片空间的访问/覆写,CMS/碎片自然大大减少

  3.4 怎么使用?BucketCache可以有两种用法

  3.4.1 与LruBlockCache搭配,作为主要的内存cache方案使用

  

 

  在hbase-site.xml中设置以下参数:

  – “hbase.bucketcache.ioengine” “heap” 
  – “hbase.bucketcache.size” 0.4(bucket cache的大小, 0.4是最大对内存的比例) 
  – 可选配置 
  • “hbase.bucketcache.combinedcache.percentage” 默认是0.9f (在CombinedCache中的比例)


  3.4.2 作为二级缓存使用,将Block缓存在我们的高速盘(Fusion-IO)中 

  

 

  在hbase-site.xml中设置以下参数:

  – “hbase.bucketcache.ioengine” “file:/disk1/hbase/cache.data”(存储block数据的路径) 
  – “hbase.bucketcache.size” 10*1024 (bucket cache的大小, 单位是MB, 10*1024 是10GB) 
  – “hbase.bucketcache.combinedcache “ false 
  – 可选配置 
  • “hbase.bucketcache.persistent.path” “file:/disk1/hbase/cache.meta”(存储bucket cache的元数据的路径, 用于启动的时候恢复cache)


  3.5.BucketCache中的Cache/Get Block逻辑? 

   
  

   简单地描述下: CacheBlock的时候,将Block放在一个RAMMap和一个Queue中,然后WriterThread异步从Queue中remove Block写入到IOEngine(内存或高速盘)中,并将BlockKey及其位置、长度等信息记录在backingMap GetBlock的时候,先访问RAMMap,然后访问backingMap获取block的位置及长度,从IOEngine读取数据 

  3.6.Block在IOEngine中的位置是怎么分配的? 

  


  我们将物理空间划分为一堆等大的Bucket,每一个Bucket有一个序号及一个size标签,于是Block所在bucket的序号及其在bucket中的offset与block在物理空间的offset就形成了一一对应。我们通过BucketAllocator为指定大小的Block寻找一个Bucket进行存放,于是就得到了其在物理空间上的位置。 
  上图描述了BucketAllocator对于Bucket的组织管理: 
  (1) 每个Bucket都有一个size标签,目前对于size的分类,是在启动时候就确定了,如默认的有(8+1)K、(16+1)K、(32+1)K、(40+1)K、(48+1)K、(56+1)K、(64+1)K、(96+1)K ... (512+1)K 
  (2) 相同size标签的Bucket由同一个BucketSizeInfo管理 
  (3) Bucket的size标签可以动态调整,比如64K的block数目比较多,65K的bucket被用完了以后,其他size标签的完全空闲的bucket可以转换成为65K的bucket,但是至少保留一个该size的bucket 
  (4)如果最大size的bucket为513K,那么超过这个大小的block无法存储,直接拒绝 
  (5)如果某个size的bucket用完了,那么会依照LRU算法触发block淘汰 
  问题: 
      如果系统一开始都是某个size的block,突然变成另外个size的block(不能存在同个size的bucket中)会发生什么,是否还会不停地进行淘汰算法? 
      是的,但是由于淘汰是异步的,影响不大,而且随着淘汰进行,bucket的大小会逐渐向那个block size大小bucket转移,最终稳定


  3.7 BucketAllocator中allocate block的流程? 
   
  


  3.8 BucketAllocator中free block的流程?
 
  

  3.9 第一种使用的测试结果 
  

 

  3.10 第二种使用的测试结果 
  


转载于:https://my.oschina.net/u/923508/blog/413943

分享到:
评论

相关推荐

    HBase中Compaction及读缓存机制研究_王运萍

    将HBase作为研究对象,分析其存储架构,针对HBase存储机制进行深入研究

    HBase学习利器:HBase实战

    数据压缩与缓存**:HBase支持多种数据压缩算法,可以显著减少存储空间的需求。同时,通过缓存机制提高数据读取速度,尤其是在热点数据访问时表现更佳。 **4. 安全性和权限管理**:HBase提供了细粒度的安全控制机制...

    Hbase学习总结.rar

    **HBase学习总结** HBase,全称是Apache HBase,...通过深入理解其核心概念和优化技巧,可以更好地利用HBase应对各种挑战。在教育领域,学习HBase有助于培养大数据处理和分析的能力,为未来的工作和研究打下坚实基础。

    Hbase学习分享

    VersionNumber是每个单元格数据的版本标识,允许HBase存储同一列的多个版本。 HBase的物理存储是基于列族的,一个表被切分成多个Region,每个Region存储了表的某个范围内的行。随着数据量的增加,Region可以分裂成...

    Hbase学习分享资料

    本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理存储、HBase系统架构,HBase调优、HBase Shell访问等。

    Hbase学习资料

    学习HBase,可以从《HBase权威指南》和《HBase实战》这两本书入手,它们分别深入探讨了HBase的设计原理、使用方法以及最佳实践,是理解并掌握HBase的重要资源。通过阅读这些书籍,你可以全面了解HBase的核心特性和...

    hbase 学习 hbase原理 hbase资料

    通过深入学习HBase,你可以掌握如何在大数据环境中构建高性能的实时数据存储系统。记住,理论知识与实践相结合是掌握HBase的关键,通过实际操作和项目经验,你会对HBase有更深入的理解。提供的“hbase 培训”资料...

    hbase学习笔记

    HBase利用Hadoop的HDFS作为底层存储,这使得HBase能够处理PB级别的数据。同时,Hadoop的MapReduce框架用于处理HBase中的大数据分析任务,提供批处理能力。 7. **Zookeeper的角色**: Zookeeper在HBase中扮演协调...

    Spark以及hbase学习资料

    在实际项目中,Spark可以用来做数据预处理、特征工程和模型训练,而HBase则作为数据仓库,存储大量的历史数据。这样的组合使得数据分析更加灵活,且能够应对海量数据的挑战。学习Spark和HBase,你需要掌握如何配置和...

    hbase学习课件

    - 高性能:通过缓存机制和列族的存储优化,提供快速的数据访问能力。 - 可伸缩性:支持水平扩展,可以通过增加节点轻松扩展系统的存储和处理能力。 - 实时读写:提供低延迟的数据访问能力。 - 数据类型单一:...

    hbase bucket cache

    - 可以利用外部存储(如 Fusionio)来扩展缓存的空间。 - 这样可以进一步增加缓存容量,提高数据访问速度。 #### 如何配置和使用 Bucket Cache ##### 作为主要缓存使用 - 配置选项: - `hbase.bucketcache....

    HbaseTemplate 操作hbase

    通过HbaseTemplate,我们可以执行常见的CRUD(创建、读取、更新和删除)操作以及更复杂的查询。 1. **HbaseTemplate的初始化**:在使用HbaseTemplate之前,我们需要在Spring配置文件中配置HBase的相关连接信息,如...

    hbase_常用配置参数_以及学习笔记讲解_以及各种原理图.zip

    在这个“hbase_常用配置参数_以及学习笔记讲解_以及各种原理图.zip”压缩包中,包含了一系列关于HBase关键概念、配置参数和原理的资料,通过以下几部分来详细介绍这些内容: 1. **HBase架构原理**: HBase采用列式...

    HBase学习笔记(个人整理)

    1. 海量存储:HBase能处理极大规模的数据,单表可以达到数十亿行、数百万列,存储能力远超传统的关系型数据库。 2. 列式存储:表结构灵活,无需预先定义列,仅插入需要的数据,便于权限控制和按列读取。 3. 多版本:...

    hbase的学习

    【HBase 学习】 HBase 是一个分布式、列式存储的开源数据库,基于 Google...理解其核心概念如 Row Key、列族、时间戳以及集群架构,是有效利用 HBase 的关键。同时,需要结合具体业务需求进行优化,以充分发挥其潜力。

    Hbase学习文档

    《HBase学习文档》 HBase,全称为Apache HBase,是构建在Hadoop文件系统(HDFS)之上的分布式列式数据库,是大数据领域的重要组件。它为海量数据提供了实时、高性能的读写能力,尤其适用于处理半结构化或非结构化的...

    Hbase权威指南(HBase: The Definitive Guide)

    - **高性能**:即使面对大量数据,HBase也能够保持快速的读写操作,这是因为其采用了一种特殊的内存缓存机制和高效的磁盘存储结构。 - **容错性**:通过数据复制和故障恢复机制,HBase能够在节点故障的情况下保证...

    HBase官方文档中文版-HBase手册中文版

    3. Hive集成:通过Hive的HBase存储过程进行数据查询。 4. Flume、Kafka集成:用于日志收集和实时流处理。 这份“HBase官方文档中文版”详细阐述了HBase的核心概念、架构、操作以及最佳实践,对于HBase的学习者和...

    小镜子之hbase学习

    例如,Facebook使用HBase存储用户活动数据,Twitter用于存储和检索推文,而阿里巴巴则利用HBase处理海量的电商交易数据。 五、学习资源 了解并熟练掌握HBase,你需要阅读官方文档,参与社区讨论,实践搭建和优化...

Global site tag (gtag.js) - Google Analytics