用于连接每个客户端,即客户端可调用所提供的这些函数访问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的数据库,电脑培训>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)