学HBase的意义是什么
我本想用MySQL来与HBase作比较,但发现他们两者毫无可比性,因为两者运用领域不同,各自有各自的优点,就好比爬山穿登山鞋,潜水穿脚蹼一般。
一门技术的兴起,一个优秀的开源项目的存在肯定是有它所存在的意义,正如大数据一样,正是因为随着时间的发展,随着技术的发展导致我们每天的数据增量达到一个非常庞大的状态,同时在数据之中又能挖掘到很多有用的信息。所以才有了大数据技术的飞速发展。
而学习HBase不仅仅是因为他属于Hadoop生态圈,而且他很特殊;
我想各位在接触HBase之前可能就没有看到过哪个数据库是面向列存储的,我也不知该如何简述他的与众不同,总之我们就沉浸下来,由笔者带各位从下文的学习中深刻体会一下吧。
目录
一、引入
HBase是什么
- HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统;
- HBase是Apache的Hadoop项目的子项目;
- HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库;
- HBase另一个不同的是HBase基于列的而不是基于行的模式;
- HBase利用Hadoop的HDFS作为其文件存储系统,利用zookeeper作为其分布式协调服务主要用来存储半结构化或非结构化的松散数据。
HBase能做什么
1. 海量数据存储:
- 上百亿行 x 上百万列
- 并没有列的限制
- 当表非常大的时候才能发挥这个作用, 最多百万行的话,没有必要放入hbase中
2. 准实时查询:
- 百亿行 x 百万列,在百毫秒以内
Hbase在实际场景中的应用
1. 交通方面:
- 船舶GPS信息,全长江的船舶GPS信息,每天有1千万左右的数据存储
2. 金融方面:
- 消费信息,贷款信息,信用卡还款信息等
3. 电商:
- 淘宝的交易信息等,物流信息,浏览信息等
4. 移动:
- 通话信息等,都是基于HBase的存储
HBase特点是什么
1. 容量大:
- 传统关系型数据库,单表不会超过五百万,超过要做分表分库
- Hbase单表可以有百亿行、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具有弹性
2. 面向列:
- 面向列的存储和权限控制,并支持独立检索,可以动态增加列,即,可单独对列进行各方面的操作
- 列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数量
3. 多版本:
- Hbase的每一个列的数据存储有多个Version,比如住址列,可能有多个变更,所以该列可以有多个version
4. 稀疏性:
- 为空的列并不占用存储空间,表可以设计的非常稀疏。
- 不必像关系型数据库那样需要预先知道所有列名然后再进行null填充
5. 拓展性:
- 底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点服务(机器)就可以了
6. 高可靠性:
- WAL机制,保证数据写入的时候不会因为集群异常而导致写入数据丢失
- Replication机制,保证了在集群出现严重的问题时候,数据不会发生丢失或者损坏
- Hbase底层使用HDFS,本身也有备份。
7.高性能:
- 底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得Hbase写入性能非常高。
- Region切分、主键索引、缓存机制使得Hbase在海量数据下具备一定的随机读取性能,该性能针对Rowkey的查询能够到达毫秒级别
- LSM树,树形结构,最末端的子节点是以内存的方式进行存储的,内存中的小树会flush到磁盘中(当子节点达到一定阈值以后,会放到磁盘中,且存入的过程会进行实时merge成一个主节点,然后磁盘中的树定期会做merge操作,合并成一棵大树,以优化读性能。)
总结:
面向列,容量大,写入比mysql快但是读取没有,超过五百万条数据的话建议读写用Hbase。
二、HBase数据模型
在HBase中有些术语需要提前了解一下:
NameSpace
- 命名空间类似于关系型数据库中数据库的概念,它其实是表的逻辑分组。
- 命名空间是可以管理维护的,可以创建,删除或者更改命名空间
- HBase有两个特殊定义的命名空间:
- default:没有明确指定命名空间的表将自动划分到此命名空间
- hbase:系统命名空间,用于包含HBase内部表
Table
HBase采用表来组织数据;
- 他不同于MySQL的是他的表不是单纯由行(记录)列(字段)组成
- 他的表由RowKey、Colum Family、Colum Qualifier、Timestamp、cell共同构成
RowKey
- RowKey是用来检索记录的主键,是一行数据的唯一标识
- RowKey可以是任意字符串最大长度是64KB,以字节数组保存
- 存储时,数据按照Row Key的字典序排序,设计RowKey时要充分考虑排序存储这个特性,将经常读取的行存放到一起
Colum Family
- 列族在物理上包含了许多列与列的值,每个列族都有一些存储的属性可配置
- 将功能相近的列存放到同一个列族中,相同列族中的列会存放在同一个store中
- 列族一般需要在创建表的时候声明,一般一个表中的列族不超过3个
- 列隶属于列族,列族隶属于表
Colum Qualifier
- 列族的限定词,理解为列的唯一标识。但是列标识是可以改变的,因此每一行会有不同的列标识
- 使用的时候必须列族:列
- 列可以根据需求动态添加或删除,同一个表中的不同行的数据列都可以不同
Timestamp
- 通过rowkey、columFamily、columqualifier确定一个存储单元通过时间戳来索引
- 每个cell都保存着同一份数据的多个版本
- 每个cell中,不同版本的数据按照时间顺序倒叙排序,即最新的数据排到最前面。
- 为了避免数据存在过多版本中造成管理负担,HBase提供了两种数据版本回收方式
- 一是存储数据的最后n个版本
- 二是保存最近一段时间的版本
cell
- Cell是由row columFamily、columQualifier、version组成
- cell中数据没有类型,全部是字节码存储的
- 因为HDFS上的数据是字节数组
三、HBase架构模型
HBase架构有三个主要组成部分:
- 客户端(Client)
- 主服务器(HMaster)
- 区域服务器(HRegionServer)
Client
- 主要功能
- 客户端负责发送请求到数据库,客户端连接的方式有很多种
- hbase shell
- 类JDBC
- client维护着一些cache来加快对hbase的访问,比如regione的位置信息。
- 客户端负责发送请求到数据库,客户端连接的方式有很多种
- 发送请求的类型
- DDL:数据库定义语言(表的建立,删除,添加删除列族,控制版本)
- DML:数据库操作语言(增删改)
- DQL:数据库查询语言(查询–全表扫描–基于主键–基于过滤器)
HMaster
- 定义
- HBase集群的主节点,HMaster也可以实现高可用(active–standby)
- 通过Zookeeper来维护主副节点的切换
- HBase集群的主节点,HMaster也可以实现高可用(active–standby)
- 作用
- 上下线的监督,创建表的时候为Region server分配region并负责Region server的负载均衡
- 负责接受客户端对table的结构DDL(创建,删除,修改)操作,DML和DQL由其他节点承担
- 因为HMaster没有联邦机制,业务承载能力有限,而且数据库的表结构很少会变化,大部分都是CRUD操作
- 表的元数据信息–>Zookeeper上面
- 表的数据–>HRegionServer上
- 负责监督HRegionServer的健康状况
- 当HRegionServer下线的时候,HMaster会将当前HRegionServer上的Region转移到其他的HRegionServer
HRegionServer
- 定义
- HBase的具体工作节点(RegionServer属于HBase具体数据的管理者),一般一台主机就是一个RegionServer
- 作用
- 一个RegionServer中包含很多HMaster分配给RegionServer的Region,同时RegionServer处理这些Region的IO请求(DML和DQL请求)
- 当客户端发送DML和DQL操作的时候,HRegionServer负责和客户端建立连接
- HRegionServer会实时和HMaster保持心跳,汇报当前节点的信息
- 当接收到Hmaster命令创建表的时候,分配一个Region对应一张表
- Region server负责切分在运行过程中变得过大的region
- 其他:
- 当意外关闭的时候,当前节点的Region会被其他HRegionServer管理
- 图解 RegionServer、Region、store和storefile之间的关系
HRegion
- 定义理解
- HRegion是HBase中分布式存储和负载均衡最小单元(HBase的表数据具体存放的位置)
- 最小单元就表示不同的HRegion可以分布在不同的 HRegion server上。
- 一个Region只属于一张表,但是一张表可以有多个Region
- HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据
- HRegion是HBase中分布式存储和负载均衡最小单元(HBase的表数据具体存放的位置)
- Region的平分
- 最开始声明表的时候就会为这个表默认创建一个Region,一个Region只属于一张表,随着时间的推移Region会越来越大 ,当达到阈值10G时,然后Region会1分为2(逻辑上平分,尽量保证数据的完整性)
- 切分后的其中一个Region转移到其他的HRegionServer上管理
- 最开始声明表的时候就会为这个表默认创建一个Region,一个Region只属于一张表,随着时间的推移Region会越来越大 ,当达到阈值10G时,然后Region会1分为2(逻辑上平分,尽量保证数据的完整性)
- 预分区
- 当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver 上。
- 为了防止前期数据的处理都集中在一个HRegionServer,我们可以根据自己的业务进行预分区
Store
- 定义理解
- 一个表中的一个列族对应一个Store
- 一个Store里面分为1个MenStore和0或多个StoreFile
- 一个表中的一个列族对应一个Store
- HRegion、Store和columns family之间的关系
- HRegion是表获取和分布的基本元素,由一个或者多个Store组成,每个store保存一个columns family。
- HFile
- HFile是Hbase在HDFS中存储数据的格式,它包含多层的索引,这样在Hbase检索数据的时候就不用完全的加载整个文件。
- StoreFile存储在HDFS上之后就称为HFile
StoreFile
- 定义理解
- StoreFile是文件的硬盘存储,直接存到HDFS上,存到HDFS之后被称为HFile
- StoreFile是数据存储文件的映射,对应HDFS上的HFile
- 表、Region、Store、StoreFile之间的关系
- 一个table对应多个Region,一个Region对应多个Store,一个Store对应一个MEMStore和多个StoreFile,多个StoreFile内部有序,但是外部无序
- 集群会设置一些阈值,当达到阈值的时候开始将小文件合并成大文件
MemStore
- 定义理解
- MemStore是基于内存存放数据,每个Store大概分配128M的空间
- HFile中并没有任何Block,数据首先存在于MemStore中。Flush发生时,创建HFile Writer
- 数据最开始优先写入到MemStore,当flush的时候才会被写入到磁盘中(之前在内存中)
- 默认情况下,一个MemStore的大小为128M,当客户端向数据库插入数据的时候,当内存使用到128M的时候,直接申请128M的内存空间,数据直接写到新内存中,原来已经满的数据写出到HDFS上,称为HFile
- MemStore与 Data Block之间的关系
- 当操作数据的时候,第一个空的Data Block初始化,初始化后的Data Block中为Header部分预留了空间,Header部分用来存放一个Data Block的元数据信息。
- 位于MemStore中的KeyValues被一个个append到位于内存中的第一个Data Block中
- 如果配置了Data Block Encoding,则会在Append KeyValue的时候进行同步编码,编码后的数据不再是单纯的KeyValue模式。
- Data Block Encoding是HBase为了降低KeyValue结构性膨胀而提供的内部编码机制
Hlog
- 定义理解
- HBase的日志机制,WAL(Write After Log)做任何操作之前先写日志,一个HRegionServer只有一个Log文档
- 日志也会存储到HDFS上,在任何操作之前先记录日志到HDFS,以后MenStore丢失数据或者RegionServer异常都能够通过日志进行恢复一个RegionServer对应的一个Hlog
- HLog文件就是一个普通的Hadoop Sequence File,SequeceFile的Key是HLogKey对象
- 作用
- 当memStore达到阈值的时候开始写出到文件之后,会在日志中对应的位置标识一个检查点
- WAL记录所有的Hbase数据改变,如果一个RegionServer在MemStore进行FLush的时候挂掉了,WAL可以保证数据的改变被应用到。如果写WAL失败了,那么修改数据的完整操作就是失败的。
- 图解Hlog在整个HBase中的结构
Zookeeper
- 定义理解
- HBase的协调服务
- 作用
- 主备选举与切换
- 记录当前集群的状态信息,当主备切换的时候,集群的状态可以被新主节点直接读取到
- 记录当前集群的数据存放信息
- 存储HBase的元数据信息
四、HBase集群搭建
其实我们搭建了这么多集群总结起来无外乎三步:
- 1.解压安装包
- 2.配置文件
- 3.启动测试
注:在搭建HBase之前,请完成jdk、zookeeper、Hadoop等基础配置,详情可见我之前的文章
Hadoop-HDFS详解与HA,完全分布式集群搭建(细到令人发指的教程)
大数据学前准备--zookeeper详解与集群搭建(保姆级教程)
搭建准备
安装包下载:Index of /hbase
本文示例版本:Index of /hbase/2.4.14
</