HBase 系统架构及数据结构
一、基本概念
一个典型的Hbase Table 表如下:
1.1 Row Key (行键)
Row Key
是用来检索记录的主键。想要访问HBase Table中的数据,只有以下三种方式:
- 通过指定的
Row Key
进行访问; - 通过Row Key的range进行访问,即访问指定范围内的行;
- 进行全表扫描。
Row Key
可以是任意字符串,存储时数据按照Row Key
的字典序进行排序。这里需要注意以下两点:
- 因为字典序对Int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。如果你使用整型的字符串作为行键,那么为了保持整型的自然序,行键必须用0作左填充。
- 行的一次读写操作时原子性的 (不论一次读写多少列)。
1.2 Column Family(列族)
HBase表中的每个列,都归属于某个列族。列族是表的Schema的一部分,所以列族需要在创建表时进行定义。列族的所有列都以列族名作为前缀,例如courses:history
,courses:math
都属于courses
这个列族。
1.3 Column Qualifier (列限定符)
列限定符,你可以理解为是具体的列名,例如courses:history
,courses:math
都属于courses
这个列族,它们的列限定符分别是history
和math
。需要注意的是列限定符不是表Schema的一部分,你可以在插入数据的过程中动态创建列。
1.4 Column(列)
HBase中的列由列族和列限定符组成,它们由:
(冒号)进行分隔,即一个完整的列名应该表述为列族名 :列限定符
。
1.5 Cell
Cell
是行,列族和列限定符的组合,并包含值和时间戳。你可以等价理解为关系型数据库中由指定行和指定列确定的一个单元格,但不同的是HBase中的一个单元格是由多个版本的数据组成的,每个版本的数据用时间戳进行区分。
1.6 Timestamp(时间戳)
HBase 中通过row key
和column
确定的为一个存储单元称为Cell
。每个Cell
都保存着同一份数据的多个版本。版本通过时间戳来索引,时间戳的类型是 64位整型,时间戳可以由HBase在数据写入时自动赋值,也可以由客户显式指定。每个Cell
中,不同版本的数据按照时间戳倒序排列,即最新的数据排在最前面。
二、存储结构
2.1 Regions
HBase Table中的所有行按照Row Key
的字典序排列。HBase Tables 通过行键的范围(row key range)被水平切分成多个Region
, 一个Region
包含了在start key 和 end key之间的所有行。
每个表一开始只有一个Region
,随着数据不断增加,Region
会不断增大,当增大到一个阀值的时候,Region
就会等分为两个新的Region
。当Table中的行不断增多,就会有越来越多的Region
。
Region
是HBase中分布式存储和负载均衡的最小单元。这意味着不同的Region
可以分布在不同的Region Server
上。但一个Region
是不会拆分到多个Server上的。
2.2 Region Server
Region Server
运行在HDFS的DataNode上。它具有以下组件:
- WAL(Write Ahead Log,预写日志):用于存储尚未进持久化存储的数据记录,以便在发生故障时进行恢复。
- BlockCache:读缓存。它将频繁读取的数据存储在内存中,如果存储不足,它将按照
最近最少使用原则
清除多余的数据。 - MemStore:写缓存。它存储尚未写入磁盘的新数据,并会在数据写入磁盘之前对其进行排序。每个Region上的每个列族都有一个MemStore。
- HFile :将行数据按照Key\Values的形式存储在文件系统上。
Region Server存取一个子表时,会创建一个Region对象,然后对表的每个列族创建一个Store
实例,每个Store
会有 0 个或多个StoreFile
与之对应,每个StoreFile
则对应一个HFile
,HFile 就是实际存储在HDFS上的文件。
三、Hbase系统架构
3.1 系统架构
HBase系统遵循Master/Salve架构,由三种不同类型的组件组成:
Zookeeper
- 保证任何时候,集群中只有一个Master;
- 存贮所有Region的寻址入口;
- 实时监控Region Server的状态,将Region Server的上线和下线信息实时通知给Master;
- 存储HBase的Schema,包括有哪些Table,每个Table有哪些Column Family等信息。
Master
- 为Region Server分配Region ;
- 负责Region Server的负载均衡 ;
- 发现失效的Region Server并重新分配其上的Region;
- GFS上的垃圾文件回收;
- 处理Schema的更新请求。
Region Server
- Region Server负责维护Master分配给它的Region ,并处理发送到Region上的IO请求;
- Region Server负责切分在运行过程中变得过大的Region。
3.2 组件间的协作
HBase使用ZooKeeper作为分布式协调服务来维护集群中的服务器状态。 Zookeeper负责维护可用服务列表,并提供服务故障通知等服务:
- 每个Region Server都会在ZooKeeper上创建一个临时节点,Master通过Zookeeper的Watcher机制对节点进行监控,从而可以发现新加入的Region Server或故障退出的Region Server;
- 所有Masters会竞争性地在Zookeeper上创建同一个临时节点,由于Zookeeper只能有一个同名节点,所以必然只有一个Master能够创建成功,此时该Master就是主Master,主Master会定期向Zookeeper发送心跳。备用Masters则通过Watcher机制对主HMaster所在节点进行监听;
- 如果主Master未能定时发送心跳,则其持有的Zookeeper会话会过期,相应的临时节点也会被删除,这会触发定义在该节点上的Watcher事件,使得备用的Master Servers得到通知。所有备用的Master Servers在接到通知后,会再次去竞争性地创建临时节点,完成主Master的选举。
四、数据的读写流程简述
4.1 写入数据的流程
- Client向Region Server提交写请求;
- Region Server找到目标Region;
- Region检查数据是否与Schema一致;
- 如果客户端没有指定版本,则获取当前系统时间作为数据版本;
- 将更新写入WAL Log;
- 将更新写入Memstore;
- 判断Memstore存储是否已满,如果存储已满则需要flush为Store Hfile文件。
更为详细写入流程可以参考:HBase - 数据写入流程解析
4.2 读取数据的流程
以下是客户端首次读写HBase上数据的流程:
- 客户端从Zookeeper获取
META
表所在的Region Server; - 客户端访问
META
表所在的Region Server,从META
表中查询到访问行键所在的Region Server,之后客户端将缓存这些信息以及META
表的位置; - 客户端从行键所在的Region Server上获取数据。
如果再次读取,客户端将从缓存中获取行键所在的Region Server。这样客户端就不需要再次查询META
表,除非Region移动导致缓存失效,这样的话,则将会重新查询并更新缓存。
注:META
表是HBase中一张特殊的表,它保存了所有Region的位置信息,META表自己的位置信息则存储在ZooKeeper上。
更为详细读取数据流程参考:
参考资料
本篇文章内容主要参考自官方文档和以下两篇博客,图片也主要引用自以下两篇博客:
官方文档:
更多大数据系列文章可以参见个人 GitHub 开源项目: 大数据入门指南
HBase 系统架构及数据结构的更多相关文章
- HBase系统架构及数据结构(转)
原文链接:Hbase系统架构及数据结构 HBase中的表一般有这样的特点: 1 大:一个表可以有上亿行,上百万列 2 面向列:面向列(族)的存储和权限控制,列(族)独立检索. 3 稀疏:对于为空(nu ...
- HBase 学习之路(二)—— HBase系统架构及数据结构
一.基本概念 一个典型的Hbase Table 表如下: 1.1 Row Key (行键) Row Key是用来检索记录的主键.想要访问HBase Table中的数据,只有以下三种方式: 通过指定的R ...
- HBase 系列(二)—— HBase 系统架构及数据结构
一.基本概念 一个典型的 Hbase Table 表如下: 1.1 Row Key (行键) Row Key 是用来检索记录的主键.想要访问 HBase Table 中的数据,只有以下三种方式: 通过 ...
- Hbase系统架构
HBase 系统架构 HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列 ...
- HBase 系统架构
HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型.它存储的是 ...
- Hbase系统架构简述
由于最近要开始深入的学习一下hbase,所以,先大概了解了hbase的基本架构,在此简单的记录一下. Hbase的逻辑视图 Hbase的物理存储 HRegion Table中所有行都按照row key ...
- Hbase 系统架构(zhuan)
一.系统架构 客户端连接hbase依赖于zookeeper,hbase存储依赖于hadoop client: 1.包含访问 hbase 的接口, client 维护着一些 cache(缓存) 来加快对 ...
- 列式存储hbase系统架构学习
一.Hbase简介 HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java.它是Apache软件基金会的Hadoop项目的一部分,运行 ...
- hbase基础-系统架构
HBase 系统架构 HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列 ...
随机推荐
- Unity使用 16bit 压缩 Texture 颜色能均匀过渡
下面是unity自带 16bit 图 的效果,可以看到颜色过度的很不均匀,占用内存 0.5M 如果调成 truecolor 后 颜色过渡很均匀,而内存却占到 1.1 M 讲图片 后缀名改成 ...
- 【AtCoder Regular Contest 076 F】Exhausted (贪心)
Description 机房里有M台电脑排成一排,第i台电脑的坐标是正整数i. 现在有N个OIer进入了机房,每个OIer需要一台电脑来学tui习ji,同时每个OIer对自己电脑所处的坐标范围有一个要 ...
- 【HDOJ5532】Almost Sorted Array(签到)
题意:给定一个n个数的数列,问删掉一个数之后剩余部分是否可以单调不增或单调不减 n<=1e5,a[i]<=1e5 思路:预处理一下前后缀是否合法 #include<cstdio> ...
- 三个div向左浮动不在同一行,向右浮动在同一行的解决办法
前几天在写代码的时候发现了一个问题,问题的大致描述如下: 在一个大的div中,同一行有三个小的div,当三个小的div均向左浮动时,会出现换行问题,均向右浮动时却在同一行. 解决这个问题的方法是在:在 ...
- PHP中的stristr(),strstr(),strpos()速度比较
测速代码: <?php function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); ret ...
- Git Base 操作(二)
1. 撤销修改 (1) 当改乱了工作区(working directory)某个文件的内容,想直接丢弃工作区中的修改时,用命令git checkout -- file. (2) 当不但改乱了工作区某个 ...
- RabbitMq解决分布式事物
一.RabbitMQ解决分布式事务思路: 案例: 经典案例,以目前流行点外卖的案例,用户下单后,调用订单服务,让后订单服务调用派单系统通知送外卖人员送单,这时候订单系统与派单系统采用MQ异步通讯. 二 ...
- 洛谷——P1186 玛丽卡
P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...
- hdu1708(C++)
这个题目明确说了不涉及大数,假设第i个为b[i]: b[0]=s1; b[1]=s2; b[3]=s1+s2; b[4]=s1+2*s2; b[5]=2*s1+3*s2: b[6]=3*s1+5*s2 ...
- json字符串调整
碰到比较长的json字符串,不知道哪里出错时,可以找一个正确的json字符串,慢慢把它调整到需要的形式,而不是去分析,字符串太长,一直看,效率太慢,容易看花眼.