总目录:https://www.jianshu.com/p/e406a9bc93a9
Hadoop - 子目录:https://www.jianshu.com/p/9428e443b7fd
HBASE的起源
自 1970 年以来,关系数据库用于数据存储和维护有关问题的解决方案。大数据的出现后, 好多公司实现处理大数据并从中受益,并开始选择像 Hadoop 的解决方案。Hadoop 使用分 布式文件系统,用于存储大数据,并使用 MapReduce 来处理。Hadoop 擅长于存储各种格式 的庞大的数据,任意的格式甚至非结构化的处理。
HBASE的定义
HBASE是一种分布式,可扩展,支持海量数据存储的nosql数据库。
HBASE的数据模型
逻辑上,HBASE的逻辑模型和关系型数据库很相似,数据存储在一张表内,有行有列,但对HBASE的底层存储结构(k-v)来看,HBASE更像是一个mutli-dimensional map
(多维map)。
HBASE的逻辑结构
逻辑结构- 首先是row key,相当于数据库的主键,保持唯一。
- 如果我们存储的数据量过大(行多,理解为高表),HBASE就会把一个表切分成若干个Region,Region是HBASE中的最小逻辑存储单位。
- 如果我们存储的单条数据量过长(列多,理解为宽表),HBASE会把邻近的一些列存储为列族(
ColumnFamily
),列族是HBASE中的最小物理存储单位(HBASE存放在hdfs中的文件就是按照列族来划分)。 - 这样的话,一个Region会被列族切分成很多块,这些块就是store。也就是说Region是由store组成的。
HBASE的物理存储
HBASE的物理存储和一张关系型数据库表差不多,但是很有自己的特点。
物理存储映射首先,逻辑表会映射成一个有RK(主键),CF(列族),CQ(字段名),TS(时间戳),Type(put或delete),Value(字段值)。
我们逻辑存入一些数据后,他们会以一种记录的方式生成物理表,物理表中有一些特殊的字段来表明这个字段值。
前面三种字段信息在录入时就已经固定了,会发生更改的是后面三个字段。
例如我们进行一次修改操作,则会添加一行时间戳大于原时间戳的数据,这样hbase在检索的时候,会自动获取CQ对应的TS最大的数据。
删除操作也一样,不过区别是删除操作生成的行中的type是delete,这样hbase会自动忽略他。(这是逻辑删除,非物理删除)
物理删除会发生在分表时,分表时会自动删去无意义的数据。
这种看起来傻乎乎的方式,正式hbase在海量化是已经保持速度的原因。
HBASE的数据模型
-
Name Space
HBASE的内存空间,类似于关系型数据库的database概念,每个命名空间下有多个表,HBASE有两个自带的命名空间,一个就叫hbase,是其内置的命名空间;一个叫做default,是用户默认使用的命名空间。 -
Region
类似于关系型数据库的table概念,不同的是hbase定义表时只需要声明列族即可,不需要声明具体的列。
这意味着向HBASE写入数据时,字段可以动态,按需指定。因此,和关系型数据库相比,hbase更灵活,更能对应字段变更的场景。 -
Row
类似于关系型数据库中的行概念。HBASE中的数据由一个RowKey和多个Column组成,数据按照RK的字典顺序排序,并且查询数据时,只能对RK进行检索,所以RK的设计至关重要。 -
Column
类似于关系型数据库中的字段概念。HBASE中的column是由Column Family和Column Qualifier来限定的,在建表时只需要声明列族即可。 -
Time Stamp
时间戳,用来标明这一行数据的版本,如果不指定时间戳,则会按照hbase的时间作为默认值。 -
Cell
是由RK-CF-CQ-TS构成的一个大key值,用来标明value的唯一性。cell是无类型字节码格式。
HBASE的基础架构
结构图从架构图可以看出来,HBASE是一个master/slaves架构。
角色
角色关系图外部有三个角色,分别是client,zookeeper还有HMaster。
-
client
负责通过 PRC 连接到集群。Client 与 Hmaster 交互进行管理类的操作,Client 与 HReginServer 交互进行读写操作。 -
zookeeper
1.存放整个 HBase集群的元数据以及集群的状态信息。
2.实现HMaster主从节点的failover。 -
HMaster
可以启动多个,通过 zookeeper 的Master Election机制保证总有一个Master在运行。它主要是是做一些管理操作,比如:
1.管理用户对表的增删改查操作
2.管理 RegionSever 的负载均衡和调整 regins分布。
3.regins split 之后负责调整新的 region 分布
4.在 RegionServer 停机之后,负责失效机器上的 Region 迁移。
内部角色是只有一个HRegionServer,他负责管理所有内部的运作。
- HRegionServer
1.存放和管理本地HRegion。
2.读写HDFS,管理Table中的数据。
3.Client直接通过HRegionServer读写数据(从HMaster中获取元数据,找到RowKey所在的HRegion/HRegionServer后)。
4.一个HRegionServer可以存放1000个HRegion。
5.底层Table数据存储于HDFS中。
6.HRegion所处理的数据尽量和数据所在的DataNode在一起,实现数据的本地化。
7.数据本地化并不是总能实现,比如在HRegion移动(如因Split)时,需要等下一次Compact才能继续回到本地化。
HRS说白了就是用来管理HR的,HR内部发生的操作才是HBASE的核心操作。
- HRegion
1.每个HRegion对应Table中一个Region,HRegion由多个HStore组成;
2.HBase使用RowKey将表水平切割成多个HRegion;
3.从HMaster的角度,每个HRegion都纪录了它的StartKey和EndKey(第一个HRegion的StartKey为空,最后一个HRegion的EndKey为空);
4.由于RowKey是排序的,因而Client可以通过HMaster快速的定位每个RowKey在哪个HRegion中;
因为HRegion是由HStore组成的,然后继续套娃。
- HStore
1.HBase存储的核心。由MemStore和StoreFile组成。
2.MemStore是Sorted Memory Buffer。
3.每个HStore对应Table中一个Column Family的存储
MemStore可以理解成是一个缓存区,将写入的数据在完成持久化之前对数据进行排序,sortFile是真正存储在HDFS中的数据文件。
- MemStore
1.为了解决如何在持久化到HDFS之前完成排序,然后再快速的顺序写入HDFS的这个问题,HBase将最近接收到的数据缓存在内存中(in Memstore)进行排序。
2.作为一个内存级缓存,缓存最近增加数据。一种显而易见的场合是,新插入数据总是比老数据频繁使用。
3.在持久化写入之前,在内存中对Rows/Cells可以做某些优化。比如,当数据的version被设为1的时候,对于某些CF的一些数据,Memstore缓存了数个对该Cell的更新,在写入HFile的时候,仅需要保存一个最新的版本就好了,其他的都可以直接抛弃。
- StoreFile
1.是可读的,一旦创建就没有办法修改了,所以之后进来的数据(不管是新增还是更新数据),都会经历内存到写到一个新的 StoreFile 的过程,但是随着 StoreFile 的数量一致积累到一定阈值,此时会触发Compact 操作,即把所有的小文件(StoreFile)里面的数据根据 row key进行版本合并和删除,生成一个大的 StoreFile。
2.单个StoreFile 的大小超过一定的阈值,会触发 Split 操作,把当前的 Region 等分成两个 Region。
3.新的两个 Region 会被Hmaster分配到对应的 HRegionServer 上。
4.在进行分割或者合并时,才会触发物理上的删除与修改。
我们上面说过,region是由行构成的,所以StoreFile中保存的是一个个的K-V行。
- HFile
1.HBase的数据以KeyValue(Cell-Value)的形式顺序的存储在HFile中
2.在MemStore的Flush过程中生成HFile,由于MemStore中存储的Cell遵循相同的排列顺序,因而Flush过程是顺序写
3.我们知道磁盘的顺序写性能很高,因为不需要不停的移动磁盘指针。
而在底层呢,因为数据存储在HDFS中,底层是由DFS client实现的,文件也被保存为一个个的DataNode。
HBASE表的特点
1、大:一个表可以有上十亿行,上百万列
2、面向列:面向列(族)的存储和权限控制,列(簇)独立检索。
3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
4、无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一 张表中不同的行可以有截然不同的列
图片失真,需要原图可以私我。
网友评论