4.3 HBase实现原理

4.3 HBase实现原理,第1张

用于连接每个客户端,即客户端可调用所提供的这些函数访问HBase的数据

充当管家,主要作用:

a) 获知整个集群中哪些Region服务器在工作、哪些有故障
b) 一个表会被分为多个Region,每个Region被分配到哪个Region服务器由Master服务器决定

一整张表会被分为多个Region,它们由Region服务器负责维护和管理。

2006年以前常设计为100-200MB,现在一般配置为1~2GB。具体设计应取决于单台服务器的处理能力(存取速度、内存等)。
前面提到过一个Region增大到一定程度会被Master服务器拆分成多个小Region。但在存储方面,一个完整的Region(拆分前的)不会被存储到不同的Region服务器上。

三层寻址对应了三层表:
(1) -ROOT-表 :存储元数据表,即MEAT表的信息。它被“写死”在ZooKeeper文件中,是唯一的、不能再分裂的
(2) META表 :存储用户数据具体存储在哪些Region服务器上。它会随存储数据的增多而分裂成更多个。
(3) 用户数据表 :具体存储用户数据。它是最底层的、可分裂的

HBase采用 三级寻址
(1) ZooKeeper找到-ROOT-表地址
(2) -ROOT-表中找到需要的META表地址
(3) META表找到所需的用户数据表地址
(4) 最后从用户数据表取出目标数据

另外,为了加速寻址,客户端会 缓存已查数据的位置信息 (在客户端自己的缓存中),下次取相同的数据就可以快速访问。——但随Region的更新,缓存记录可能失效。对于这个问题,HBase采用惰性解决机制,即首先使用缓存的位置,如果在那个位置查不到目标数据,则按三级寻址重新查询,再更新缓存。

假设一个Region最大128MB(注意-ROOT-、META、用户表都是以Region形式存储的),一条映射条目大小1KB:

Reference:
>

HDFS是GFS的一种实现,他的完整名字是分布式文件系统,类似于FAT32,NTFS,是一种文件格式,是底层的,Hadoop HDFS为HBase提供了高可靠性的底层存储支持。

HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统。

扩展资料:

Hadoop 中各模块的作用: 

1、Hadoop HDFS为HBase提供了高可靠性的底层存储支持。

2、Hadoop MapReduce为HBase提供了高性能的计算能力。

3、Zookeeper为HBase提供了稳定服务和failover机制。

4、Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变得非常简单。

5、Sqoop则为HBase提供了方便的RDBMS(关系型数据库)数据导入功能,使得传统数据库数据向HBase中迁移变得非常方便。

参考资料来源:百度百科-HBase

    虽说hbase适合写多读少,但是hbase的读性能也是非常强悍的,hbase有如此好的读性能其中少不了BlockCache。BlockCache是regionserver级别的一种缓存,目前有三种实现方式:LruBlockCache、SlabCache和BucketCache,本文只对BucketCache的实现方式进行剖析。本文从BucketCache的内存模型、读写流程以及使用配置三方面进行说明。

    BucketCache可以指定三种不同的存储介质:onHeap(java堆上内存)、offHeap(java堆外内存)和file(文件),不管使用哪种存储介质,内部的内存模型、读写流程都是一致的。

    关于内存模型,BucketCache初始化时默认会申请14个不同大小的Bucket,一种Bucket存储一种指定BlockSize的数据块,每个Bucket的大小默认为2M,不同大小的Bucket之间的内存是可以互相使用的,从而保证的内存的使用率。BucketCache的内存模型如下图所示:

    BucketCache中一共包括5个模块:ramCache、backingMap、ioEngine、writerThreads和BucketAllocator。

ramCache:block在写入BucketCache中指定的存储介质之前会先存储在ramCache这map中。

backingMap:记录写入BucketCache的BlockKey和对应Block在BucketCache中的offset。

ioEngine:实际写入存储介质的类,将Block数据写入对应地址的空间中。

writerThreads:多个线程,主要负责异步将Block写入存储介质中,每个线程都有一个支持并发的队列,用来存储Block。

BucketAllocator:为Block分配存储介质上的空间,主要就是获取一个存储介质上的offset,不同Bucket大小有对应的BucketAllocator。

    BucketCache中的读写流程如下图所示:

1进入到BucketCache类中的Block会首先将BlockKey和对应的Block存入到ramCache这个map,之后将该Block存入到对应writerThread线程对应的队列中。

2writerThread线程持续地从队列中获取所有的Block。

3调用对应Bucket大小的BucketAllocator为对应大小的Block分配内存,也就是获取一个存储介质上的offset。

4调用ioEngine模块将Block写入到分配好的空间上。

cacheBlockWithWait:

    cacheBlockWithWait方法是BucketCache写入Block的入口函数。

WriterThreadrun

     异步写入存储介质的后台线程。

doDrain

    将队列中的Block写入ioEngine模块指定的存储介质中,并将对应的entry写入backingMap中。

1 首先从RAMCache中查找。对于还没有来得及写入到bucket的缓存block,一定存储在RAMCache中。

2 如果在RAMCache中没有找到,再在BackingMap中根据blockKey找到对应物理偏移地址offset。

3 根据物理偏移地址offset可以直接从内存中查找对应的block数据。

getBlock:

    从Bucketcache中获取对应的block的入口方法。

    BucketCache分为三种存储介质:onHeap、offHeap、file。下面对这三种配置进行分别说明。

onHeap模式

offHeap模式

file模式

       今天的分享就到这,有看不明白的地方一定是我写的不够清楚,所有欢迎提任何问题以及改善方法。

hbase概念:  非结构化的分布式的面向列存储非关系型的开源的数据库,根据谷歌的三大论文之一的bigtable  高宽厚表  作用:  为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
  能干什么:  存储大量结果集数据,低延迟的随机查询。
  sql:  结构化查询语言  nosql:  非关系型数据库,列存储和文档存储(查询低延迟),hbase是nosql的一个种类,其特点是列式存储。
  非关系型数据库--列存储(hbase)  非关系型数据库--文档存储(MongoDB)  非关系型数据库--内存式存储(redis)  非关系型数据库--图形模型(graph)  hive和hbase区别  Hive的定位是数据仓库,虽然也有增删改查,但其删改查对应的是整张表而不是单行数据,查询的延迟较高。
其本质是更加方便的使用mr的威力来进行离线分析的一个数据分析工具。
  HBase的定位是hadoop的数据库,电脑培训>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10614149.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存