HBase
初识HBase
为什么列式存储广泛应用于OLAP(列式存储)中
传统的事务型数据库OLTP 如Orcle、Mysql等都是以行的方式进行存储的
分析型数据库OLAP使用的是列式存储,如HBase等大数据相关的数据库
行式存储的原理和特点
对于OLTP场景,大多都是对一整行的数据进行增删改查的操作,那么行式存储就是一个非常不错的选择。
当查询基于需求字端查询和返回结果的时候,字端都藏在各行数据中,所以必须要读取一整条的行数据,大量的寻址操作使的效率低下
列式存储的原理和特点
对于OLAP场景,一个典型的查询需要遍历整个表,进行分组、排序、聚合等操作,这样一来式存储的优待你就不存在了。而且,分析型SQL,大多数情况下不会使用到所有的列。而是对其中某些列进行操作,而OLTP中仅仅是对其中的某些列进行操作,就需要读取所有的列。
列式存储不仅具有按需查询来提高效率的优势,由于同一列的数据属于同一类型,如数值类型、字符串类型等,相似度很高,还可以使用合适的编码压缩用于减少数据的存储空间,进而减少IO提高读取性能。
HBase 的特点
易扩展
HBase的扩展性主要体现在两个方面,一个是基于运算能力(RegionServer)的扩展,通过增加RegionSever节点的数量提升HBase的上层处理能力,另一个是基于存储能力的扩展(HDFS),通过增加DN的节点数量对存储层进行扩展,提升HBase的数据存储能力。
海量存储
HBase 作为一个开源的分布式K-V 数据库,其主要功能是面向PB 级别数据的实时入库和快速随机访问,主要通过易扩展的方式进行数据的海量存储。
列式存储
HBase中是根据列族来存储数据的。列族下面有非常多的列。列式存储的最大好处是,数据在表中是按照某列进行存储的,这样在查询的时候就只需要少数的几个字端,能大大减少读取的数据量
高可靠性
WAL机制保证了数据写入时不会因为集群异常而导致写入数据丢失,Replication机制保证了在集群出现严重问题的时候,数据不会发生丢失和损坏。而HBase的底层使用了HDFS,HDFS也存在备份机制
稀疏性
在HBase 的列族中,可以指定任意多的列,为空的列不占用存储空间,表可以设计的非常稀疏
HBase的架构
HBase可以将数据存储在本地文件系统也可以存储在HDFS文件系统中。在生产环境中,HBase一般运行在HDFS上,以HDFS作为基础的存储设施。HBase 通过HBase Client提供Java API 来访问HBase数据库,以完成数据的写入和读取。Hbase 的核心架构主要由Hbase Client、HMster 、Region Sever 、ZooKeeper以及HDFS组成。
HBase Client
Hbase Client 为用户提供了访问HBase的借口,可以通过元数据定位到目标数据的RegionSever,另外HBase Client 还维护了对应的Cache (高速缓冲存储器)来加速Hbase的访问,比如缓存元数据信息。
HMaster
Hbase集群的主节点,负责集群的管理工作
- 负责管理Region Sever,实现其负载均衡
- 负责创建和删除表格
- HMaster 负责给RegionSever分配Region
- HMaster 负责协调管理RegionSever达到负载均衡,一方面负责将用户的数据均衡的分布在各个Region Sever 上,防止Region Sever数据倾斜过载。另一方面负责将用户的请求均衡的分布在各个Region Sever上,防止Region Sever请求过热。
- 维护数据:发现失效的Region ,并将失效的Region分配到正常的Region Sever上,并且在Region Sever失效的时候,协调对应的HLog进行任务的拆分。
Region
- 由于HBase运行在HDFS上,HDFS又是分布式存储的文件系统,整个的HBase表格在一个节点时无法被存储的,所以HBase的表格将会以行进行拆分存储到各个节点上,拆分的部分被成为Region
- Region就是一定范围内存储在一起的行,默认大小为256MB,可以在hbase-site.xml文件中进行配置,最大为4GB
RegionSever
直接对接用户的读写请求
概念:
- 每一个从节点都有一个RegionSever,一个RegionSever负责管理多个Region
- 一个Region只由一个Region Sever进行管理,Region Sever 用来处理来自客户端的读取、写入、更新和删除请求
- 遵循Region 的设定值来确定Region的大小,默认256MB,最大4GB
基本结构
- 一个RegionSever包含多个Region
- Region : 每一个Region都有起始RowKey和结束RowKey,代表了存储的Row的范围,保存着表中某段连续的数据
- Store:一个Region 由多个Store组成,每一个Store 都对应了一个Column Famliy,Store 包含MemStore 和 StoreFile
- MemStore:作为HBase中的内存数据存储,数据的写操作会先写到MemStore中,当MemStore 中的数据增长到一个阈值的时候(默认为64M),Region Sever 会启动flasheatch 进程将MemStore中的数据写入到Store File持久化存储,每次写入后都会单独形成一个Store File。当客户端检索数据的时候,先在MemStore中查找,如果MemStore中不存在,则会在StoreFile中查找
- StoreFile:MemStore 内存中数据写到文件中就是StoreFile,StoreFile 底层是以HFile的格式进行保存。HBase 以Store的大小来判断是否需要切分Region,当一个Region中的所有StoreFile 的大小和数量都增涨到超过一个阈值的时候,Hmaster会将Region切分为两个,并分配到其他的RegionSever上,实现负载均衡。
- HFile:HFile和StoreFile是同一个文件,只不过站在HDFS的角度这个文件被称为HFile,站在HBase的角度被称为HFile
- HLog:负责记录着数据的操作日志,当HBase 出现故障时可以进行日志重放、故障恢复
功能
- 管理HMaster分配的Region
- 负责与底层的HDFS交互,存放数据到 HDFS
- 负责Region变大之后的拆分以及Store File的合并工作
- 与Hmaster进行协同:当某个RegionSever宕机之后,ZooKeeper会通知Master 进行失效备援。下线的RegionSever 所负责的Region 暂时停止对外提供服务,Master 会将该RegionSever所负责的Region转移到其他的RegionSever上,并且对下线的RegionSever 上存在Memstore中还未持久化的数据由WAL重播进行恢复。
存放示例图
其中HBase表格的行将拆分为Region,放入到各个Region Sever中。
Region Sever的服务机制
- 一个Region Sever 可以管理多个Region,一个Region只能由一个RegionSever进行管理
- Hfile 实际存储文件,表格被拆分的具体的数据存放在Hfile中,Hfile存放到磁盘中
- MemStore 写入缓存,用于存储尚未写入磁盘的新数据。一个区域中的每一个列族都有一个MemStore。减少磁盘浪费
- Block Cache 读取缓存,加快读写响应时间,减少延迟
- WAL 预写日志,防治Region Sever崩溃时导致数据丢失
ZooKeeper
HBase通过ZooKeeper 来实现选举Hmaster、监控RegionSever、维护元数据集群配置等工作
- HBase 使用zookeeper 作为分布式协调服务来维护集群中的RegionSever状态,控Region Sever的状态,当RegionSever异常的时候,通过回调的形式通知HMaster 有关的Region Sever的上下线的信息
- 维护元数据和集群配置:与RegionSever建立客户端通道
- Zookeeper 维护RegionSever是否处于活跃状态并且可用,并且提供RegionSever故障通知
- Zookeeper 可以帮助我们跟踪HBase所在的所有的RegionSever
- HMaster 通过实际联系Zookeeper来获取RegionSever的详细信息
- 选举HMaster :通过ZooKeeper 来保证集群中有一个HMaster正在运行,如果HMaster 异常,则会通过选举机制生成新的HMaster 来提供服务。
HDFS
HDFS为HBase 提供底层的数据存储服务,同时为HBase提供高可用的支持,Hbase将HLog存储在HDFS上。
注意事项
- master负责的是表的增删改查,但是master挂了时不影响数据的增删改查
- Region Sever是基于HDFS的,所以单点挂了时不影响集群访问的,Master 也需要启动多台,来做高可用,Master挂掉其他的节点会竞争成为Master
HBase的数据模型
Hbase是面向列式存储的分布式数据库,在Hbase的表中,一条数据拥有全局唯一的键RowKey和任意数量的列Column,一列或者多列组成一个列族Column Family,同一个列族中嘞的数据在物理意义上都存储在同一个Hfile上,这样的列式存储的结构有利于数据缓存和查询。Hbase中的表是稀疏存储的,因此用户可以动态的为数据定义不同的列。Hbase中的数据按照主键进行排序,同时,Hbase会将表按照主键划分为多个Region存储在不同的Region Sever上,用来完成数据的分布式存储和读取。
HBase的逻辑结构
Row-Key是必需的,而且是唯一的,personal_info、office_info是列族,不同的列族是分开存储的。列族的下面才是存储数据的列,而列是可以随便增加的。
上图是Hbase表的逻辑结构,实际存储中,一个表可能是放在不同的服务器节点上的。
HBase 的物理存储
一条记录的某个字段中存储的数据,可能会有多个版本,版本是通过TimeStamp 时间戳来进行控制的。例如,修改和删除数据,其实是增加一个版本,当查询数据的时候,通过时间戳来返回最后修改的结果。所以对于HBase来说,集群和客户端一定要注意时间同步的设置,否则可能会出现,数据进行了修改或者删除,但是数据查询并没有变化的情况。
从上图可以得知数据的真实存储情况。可以看到张三的数据是经过修改的,所以修改数据实际上也是put操作,删除数据也不是马上进行删除,但是对于用户来说就是看不见的,而且后续的HBase也会对删除的数据或者是修改前的数据进行处理。
数据模型
Name Space
命名空间,相当于Mysql中的Database,每个命名空间下有多个表。hbase和defalut是HBase自带的命名空间hbase命名空间中是HBase的内置表,defalut是用户默认使用的命名空间。
HBase将表中数据基于RowKey的不同范围划分到不同的Region上,每个Region都负责移动范围的数据存储和访问。
每一个表在开始的时候都只有一个Region,随着数据的不断插入,Region达到一个阈值的时候,Region会等分为两个新的Region。当表中国呢行不断的增多,会有越来越多的Region
另外,Region时HBase中分布式存储和负载均衡的最小单元,不同的Region 可以分布在不同的Region Sever上,但是一个Region 是不会拆分到多个Region Sever上的
这样即使数据量大,由于数据被划分到不同的Region上,每个Region 都可以独立的进行写入和查询,HBase 写、查询的时候可以多个Region并发操作,因此访问速度不会降低
Region
类似与Mysql中表的概念,但是这里相当于表的切片(表数据量到达一定的程度就会自动切片)。HBase中定义表时,自需要定义列族,而不需要声明具体的列,这就意味着HBase写入数据时,字端可以按需进行变化。
Row
HBase中的一条记录,有一个RowKey和多个列组成。数据是按照RowKey的字典排序,而查询数据的时候,只能通过RowKey进行查询。
RowKey
RowKey的概念和关系型数据库中主键相似,HBase使用RowKey 来唯一标识某行的数据
HBase访问数据的三种方式:
- 基于RowKey的单行查询
- 基于RowKey的范围查询
- 全表扫描查询
Column Family
Column Family即列族,HBase基于列划分数据的物理存储,一个列族可以包含多个列
一般来说同一类的列会放在一个列族中,每个列族都有一组存储属性:
- 是否应该缓存在内存中
- 数据如何被压缩或行键如何编码等
HBase在创建表的时候必须指定列族。官方推荐在创建表的列族的时候列族的数量最好小于等于3,过多的列族不利于Hbase的数据的管理和索引
Column
Hbase中的每一个列都是有Column Family 和Column Qualifier 进行限定的。
TimeStamp
在HBase中使用不同的TimeStamp用来标记相同Rowkey的不同版本的数据,相同的RowKey的数据按照TimeStamp的倒序进行排序。默认查询到的是最新版本,但是也可以指定TimeStamp的数值来查询指定版本的数据
TimeStamp用于标记数据的不同版本。数据写入时,如果不指定时间,HBase会自动写入,其数值为数据写入时间
Cell
由{RowKey,Column Famliy,Column Qualifier,TimeStamp}唯一确定的单元,cell中存储的数据类型都是字节码,即字节数据。
HBase的写入流程
Region Sever 寻址
- HBase Client 访问ZooKeeper
- 获取写入Region所在的位置,即获取Hbase:meta 表位于哪个Region Sever
- 访问对应的Region Sever
- 获取hbase:meta 表,并查询出目标数据位于哪一个Region Sever的那个 Region中,并将该table 的Region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问
写HLog
- Hbase Client 向Region Sever 发送写Hlog请求
- Region Sever 会通过顺序写入磁盘的方式,将HLog 存储在HDFS 上
写MemStore并返回结果
- Hbase Client 向Region Sever发送写MemStore的请求
- 只有当写Hlog 和写 MemStore 的请求都成功之后,并且将结果反馈给Hbase Client,这时对于整个的Hbase Client 写入流程已经完成
MemStore刷盘
HBase 会根据MemStore 配置的刷盘策略定时将数据刷新到StoreFile中,完成数据的持久化存储
HBase的读流程
Region Sever 寻址
HBase Client 请求ZooKeeper 获取元数据表所在的Region Sever的地址
Region 寻址
HBase Client 请求RegionSever 获取需要访问的元数据,查询出目标数据位于哪个Region Sever中的哪个Region 中,并将该table的region信息和meta 表的位置信息缓存在meta cache中,方便下次访问。
数据读取
HBase Client 请求数据所在的Region Sever,获取所需的数据。Region 首先在MemStore 中查找,若命中则返回;如果在MemStore中找不到,则通过BloomFilter 判断数据是否存在,如果存在则在S头热File中扫描并将结果返回
Hbase数据删除
HBase的数据删除操作并不会立即将数据从磁盘上删除,因为HBase的数据通常被保存在HDFS中,而HDFS 只允许新增或者追加文件,所以HBase的删除操作主要是对被删除数据进行标记。
当执行删除操作时,Hbase 新插入一条相同KV的数据,但是KeyType = Delete,这便意味着数据被删除了,直到发生Major_compaction操作,数据才会真正的被删除。
HBase这种基于标记的删除方式时按顺序写磁盘的,因此很容易实现海量数据的快速删除。
标签:存储,Region,RegionSever,HBase,数据,Sever From: https://www.cnblogs.com/baiyunhao/p/17208727.html