HBase原理总结

在总结Spark读写HBase的同时,也顺便学习了一下HBase的原理,同样做个简单的记录。事实上,相关的总结网上超级多,写的已经很到位了。本文一些内容会直接摘取相关参考资料,对原文作者表示感谢。

我自己觉得学习大数据原理时最麻烦的就是逻辑概念和物理概念的交叉混叠。每一套组件里都涉及到很多新的专有名词,很容易就搞混弄乱。学习过程中最重要的还是集中注意力,参考多份资料,仔细反复阅读,效果会好些。

1.HBase简介

HBase是Hadoop生态圈中的非关系型数据库,其最大的特点是面向列存储、可以实现在超大规模数据集上的实时读写和随机访问,可以说是对HDFS的有益补充。

传统的行存储是将完整的数据行存储在磁盘中,查询时会读取该行的所有数据列。但有些应用场景,只需要一小部分数据列,这种方式就很浪费IO。

列存储就是将同一个数据列的各个值存放在一起,也就是说插入某行数据时,该行的各个数据列的值会存放到不同的地方。好处就是需要某几列数据时,可以很方便读取。

2.HBase数据模型

HBase同数据库一样,也是以表的形式存储数据。表由行和列构成,若干列可以组成一个列族(Column family)。

2.1 HBase逻辑数据模型

hbase1.jpg

基本概念:
- RowKey:每条记录的“主键”
- Column Family:列族,包含一个或者多个相关列,列族是表的Schema的一部分
- Column:属于某一个columnfamily,即familyName:columnName,每条记录在同一个列族中可以由不同的列组成
- Version Number:版本,类型为Long,默认值是系统时间戳timestamp,也可由用户自定义
- Value:值

2.2 HBase物理数据模型

hbase2.jpg
  • 对于任意值,都是按照<key, columnfamily, columnname, timestamp, value>这种多级索引结构存储的
  • 每个column family存储在HDFS上的一个单独文件中,空值不会被保存
  • HBase中通过RowKey和Column确定的一个存储单元称为Cell。每个Cell都保存着同一份数据的多个版本,默认情况下通过时间戳区分。

3.HBase体系架构

hbase3.jpg

从架构上看,HBase由client、Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等构成。

  • client:访问HBase的接口,可以是HBase Shell、HBase-Client API等
  • Master:协调多个Region Server,侦测各个RegionServer之间的状态,并平衡RegionServer之间的负载,分配Region给RegionServer。
  • zookeeper:维护HBase集群,Master与RegionServers启动时会向Zookeeper注册。集群内可以有多个Master,但是ZK保证只有一个对外提供服务,其他做Stand by,出现宕机有相应的选举机制选出新Master服务。
  • Region Server:对于一个RegionServer而言,其包括了多个Region。RegionServer的作用是维护Master分配给他的region,以及实现读写IO操作。Client通过zookeeper寻址,最终也是直接连接RegionServer实现读取数据。
  • Region:table在行的方向上分隔为多个Region,不同的region可以分别在不同的Region Server上。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值时就会分成两个新的region。

以上是宏观上HBase的体系架构,下面就是更细节的信息,主要是对Region的剖析。

hbase4.jpg
  • Store:每一个region由一个或多个store组成,一个store存放一个列族,如果有几个ColumnFamily,也就有几个Store。一个Store由一个memStore和0或者 多个StoreFile组成。HBase以store的大小来判断是否需要切分region。
  • MemStore:存放在内存中,保存修改的数据。当memStore的大小达到一个阀值(默认128MB)时,memStore会被flush到StoreFile。
  • StoreFile:MemStore快照后存储在StoreFile中,其底层是以HFile的格式保存。
  • HFile:HFile是Hadoop的二进制格式文件,就是按照一定的结构存储信息。HFile也是一个逻辑概念,最后落地是HDFS。HFile的存储格式有点像帧结构这种一大堆,就不展开了。
hbase5.jpg
  • HLog(WAL log):WAL意为write ahead log,用来做灾难恢复使用。每个RegionServer中都会有一个HLog的实例,会将RegionServer的所有更新操作记录在HLog中,一旦regionServer宕机,就可以从log中进行恢复。HLog本身就是一个保障HA的机制,跟Hadoop的NameNode中的Edits的作用一样。

HBase基本体系架构就是这样,从宏观上理解:Client作为API接口,访问HBase;Master是整个集群的大脑,负责维护RegionServer;RegionServer管理若干个Region,并实现与Client的数据通信;Region是逻辑上分布式存储和负载均衡的最小单元;Zookeeper实现对集群的监护和HA。

从微观上理解Region,一个table会至少有一个Region,随着数据量的增大,Region实现分裂。Region内部由多个Store构成,每个Store存储一个列族。Store又由MemStore、StoreFile构成,MemStore内存写到一定程度后落磁盘到StoreFile。

4.Region寻址

hbase6.jpg

HBase通过三级索引结果实现Region的寻址。我们逆序描述这个设计的思路,HBase的所有数据Region元数据被存储在.META.表中,但是随着Region增多,显然.META.会越大越大,最终也会分裂成多个Region;-ROOT-表实现定位.META.表的Region的位置,保存.META.表中所有Region的元数据。而且-ROOT-不会分裂,只有一个region。Zookeeper会记录-ROOT-表的位置信息。

我们在正序描述寻址过程,Client通过ZK找到-ROOT-表的位置,通过-ROOT-表查找到.META.的位置,再从.META.查找用户Region的位置。可以实现最多三次跳转就可以定位任意一个Region的效果。为了加快访问速度,.META.表的所有Region全部保存在内存中。客户端会将查询过的位置信息缓存起来,且缓存不会主动失效。

5.HBase读写过程

这部分直接拿来了参考文章的截图,写的已经很简单清晰了。

hbase7.jpg

5.1 读过程

  • Client访问ZK,通过-ROOT-和.META.表,查找到表的Region元数据,并找到相应的RegionServer
  • Client直接与RegionServer通信获取数据
  • Regionserver的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache

5.2 写过程

  • Client访问ZK,通过-ROOT-和.META.表,查找到表的Region元数据,并找到相应的RegionServer
  • 数据被写入HLog和Region的MemStore中,当MemStore达到预设阈值后,Flush成一个StoreFile
  • StoreFile文件的不断增多,当其数量增长到一定阈值后,触发Compact合并操作,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除
  • StoreFile的大小超过一定阈值后,会把当前的Region分割为两个(Split),并由Hmaster分配到相应的HRegionServer,实现负载均衡

6.HBase的HA

  • Master的HA机制:Master为一主多备。当Master主节点宕机后,剩下的备节点通过ZK选举,产生新的主节点
  • RegionServer容错:当RegionServer损坏时,Master将该RegionServer上的Region重新分配到其他RegionServer上,失效服务器上“预写”日志由主服务器进行分割并派送给新的RegionServer

7.参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容