1.HBase数据模型概述
- HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符和时间戳。
- 每个值是一个未经解释的字符串,没有数据类型
- 表在水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,同一个列族里面的数据存储在一起
- HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留(这是和HDFS只允许追加不允许修改的特性相关的)
-
表:HBase采用表来组织数据,表由行和列组成,列划分为若干个列族
-
行:每个HBase表都由若干行组成,每个行由行键(row key)来标识。
-
列族:一个HBase表被分组成许多“列族”(Column Family)的集合,它是基本的访问控制单元
-
列限定符:列族里的数据通过列限定符(或列)来定位
-
单元格:在HBase表中,通过行、列族和列限定符确定一个“单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[]
-
时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引
-
HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此,可以视为一个“四维坐标”,即 [行键, 列族, 列限定符, 时间戳]
2.概念视图与物理视图
在定义 HBase 表的时候需要提前设置好列族,表中所有的列都需要组织在列族里面。列族一旦确定后,就不能轻易修改,因为它会影响到 HBase 真实的物理存储结构,但是列族中的列限定符及其对应的值可以动态增删。
3.面向列的存储
4.HBase的实现原理
HBase功能组件
HBase的实现包括三个主要的功能组件
- 库函数:链接到每个客户端
- 一个Master主服务器
- 许多个Region服务器
- 主服务器Master负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡。
- Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求
- 客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据
- 客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小
Region的定位
目前每个Region最佳大小建议1GB-2GB(2013年以后的硬件配置)
同一个Region不会被分拆到多个Region服务器
每个Region服务器存储10-1000个Region
- 元数据表,又名.META.表,存储了Region和Region服务器的映射关系。当HBase表很大时, .META.表也会被分裂成多个Region
- 根数据表,又名-ROOT-表,记录所有元数据的具体位置
- -ROOT-表只有唯一一个Region,名字是在程序中被写死的
- Zookeeper文件记录了-ROOT-表的位置