HBase原理介绍
- 认识HBase
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PCServer上搭建起大规模集群。它是一个可以随机访问的存储和检索数据的平台。它不介意数据类型,允许动态的,灵活的数据模型。
HBase位于结构化存储层,Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。
1)行键(RowKey)
-- 行键是字节数组, 任何字符串都可以作为行键;
-- 表中的行根据行键进行排序,数据按照Row key的字节序(byte order)排序存储;
-- 所有对表的访问都要通过行键 (单个RowKey访问,或RowKey范围访问,或全表扫描) (二级索引)
2)列族(ColumnFamily)
-- CF必须在表定义时给出
-- 每个CF可以有一个或多个列成员(ColumnQualifier),列成员不需要在表定义时给出,新的列族成员可以随后按需、动态加入
-- 数据按CF分开存储,HBase所谓的列式存储就是根据CF分开存储(每个CF对应一个Store),这种设计非常适合于数据分析的情形
3)时间戳(TimeStamp)
-- 每个Cell可能又多个版本,它们之间用时间戳区分
4)单元格(Cell)
-- Cell 由行键,列族:限定符,时间戳唯一决定,数据全部以字节码形式存储
5)区域(Region)
-- HBase自动把表水平(按Row)划分成多个区域(region),每个region会保存一个表里面某段连续的数据;
-- 每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region;
-- 当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Region 上。
-- HRegion是HBase中分布式存储和负载均衡的最小单元(默认256M)。最小单元表示不同的HRegion可以分布在不同的HRegionServer上。但一个HRegion不会拆分到多个server上。
特点:
无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
面向列:面向列(族)的存储和权限控制,列(族)独立检索;
稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;
- HBase结构:
其中HMaster节点用于:
1.管理HRegionServer,实现其负载均衡。
2.管理和分配HRegion,比如在HRegion split时分配新的HRegion;在HRegionServer退出时迁移其内的HRegion到其他HRegionServer上。
3.实现DDL操作(Data Definition Language,namespace和table的增删改,column familiy的增删改等)。
4.管理namespace和table的元数据(实际存储在HDFS上)。
5.权限控制(ACL)。
HRegionServer节点用于:
1.存放和管理本地HRegion。
2.读写HDFS,管理Table中的数据。
3.Client直接通过HRegionServer读写数据(从HMaster中获取元数据,找到RowKey所在的HRegion/HRegionServer后)。
ZooKeeper集群是协调系统,用于:
1.存放整个 HBase集群的元数据以及集群的状态信息。
2.实现HMaster主从节点的failover。
HBase Client通过RPC方式和HMaster、HRegionServer通信;一个HRegionServer可以存放1000个HRegion;底层Table数据存储于HDFS中,而HRegion所处理的数据尽量和数据所在的DataNode在一起,实现数据的本地化;数据本地化并不是总能实现,比如在HRegion移动(如因Split)时,需要等下一次Compact才能继续回到本地化。
- 读写示意图
写操作流程
a) Client发起了一个Put请求给HRegionServer
b) HRegionServer会将请求匹配到某个具体的HRegion上面
c) 决定是否写WAL log。WAL log文件是一个标准的Hadoop SequenceFile,文件中存储了HLogKey,这些Keys包含了和实际数据对应的序列号,主要用于崩溃恢复。
d) Put数据保存到MemStore中,同时检查MemStore状态,如果满了,则触发Flush to Disk请求。
e) HRegionServer处理Flush to Disk的请求,将数据写成HFile文件并存到HDFS上,并且存储最后写入的数据序列号,这样就可以知道哪些数据已经存入了永久存储的HDFS中。
读操作流程
a) client访问Zookeeper,查找-ROOT-表,获取.META.表信息。
b) 从.META.表查找,获取存放目标数据的HRegion信息,从而找到对应的HRegionServer。
c) 通过HRegionServer获取需要查找的数据。
d) HRegionserver的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache。
- Write-Ahead-Log(WAL)
每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中,HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复
HBase容错性
Master容错:Zookeeper重新选择一个新的Master
--无Master过程中,数据读取仍照常进行,region切分、负载均衡等无法进行;
RegionServer容错:定时向Zookeeper汇报心跳,如果一旦时间内未出现心跳,Master将该RegionServer上的Region重新分配到其他RegionServer上,失效服务器上“预写”日志由主服务器进行分割并派送给新的RegionServer
Zookeeper容错:Zookeeper是一个可靠地服务,一般配置3或5个Zookeeper实例
- HBase的优点
1 列的可以动态增加,并且列为空就不存储数据,节省存储空间.
2 Hbase自动切分数据,使得数据存储自动具有水平scalability.
3 Hbase可以提供高并发读写操作的支持
- HBase的缺点:
1 不能支持条件查询,只支持按照Row key来查询.
2 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.
- HBase与传统数据库的比较
一、数据类型
HBase只有简单的字符串类型,所有的类型都是交由用户自己处理的,它只保存字符串。
而关系数据库有丰富的类型选择和存储方式。
二、数据操作
HBase只有很简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系,所以不能、也没有必要实现表和表之间的关联等操作。
而传统的关系数据通常有各种各样的函数、连接操作。
三、存储模式
HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的。
传统的关系数据库是基于表格结构和行模式保护的。
四、数据维护
确切的说,HBase的更新操作不应该叫做更新,虽然一个主键或列对应新的版本,但它的旧版本仍然会保留,所以它实际上是插入了新的数据,而不是传统关系数据库里面的替换修改。
五、可伸缩性
HBase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻松地增加或减少(在硬件错误的时候)硬件数量,并且对错误的兼容性比较高。
而传统的关系数据库通常需要增加中间层才能实现类似的功能。