✎ 学习目标
- 理解HBase的数据类型和架构
- 掌握HBase的集群部署
- 理解HBase读写数据流程
- 掌握HBase与Hive的整合
Spark计算框架是如何在分布式环境下对数据处理后的结果进行随机的、实时的存储呢?HBase数据库正是为了解决这种问题而应用而生。HBase数据库不同于一般的数据库,如MySQL数据库和Oracle数据库是基于行进行数据的存储,而HBase则是基于列进行数据的存储,这样的话,HBase就可以随着存储数据的不断增加而实时动态的增加列,从而满足Spark计算框架可以实时的将处理好的数据存储到HBase数据库中的需求。
HBase的概述
HBase的简介
HBase起源于2006年Google发表的BigTable论文。HBase是一个高可靠性、高性能、面向列、可伸缩的分布式数据库,利用HBase可在廉价PC服务器上搭建起大规模结构化存储集群。HBase的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。
HBase的特点:容量大 面向列 多版本 稀疏性 扩展性 高可靠性
HBase数据库和传统数据库的区别
- 存储模式
传统数据库中是基于行存储的;而HBase是基于列进行存储的。 - 表字段
传统数据库中的表字段不超过30个;而HBase中表字段不作限制。 - 可延伸性
传统数据库中的列是固定的,需要先确定列有多少才会增加数据去存储;而HBase是根据数据存储的大小去动态的增加列,列是不固定的。
HBase的数据模型
HBase分布式数据库的数据存储在行列式的表格中,它是一个多维度的映射模型,其数据模型如下所示。
Row Key(行键):RowKey表示行键,每个HBase表中只能有一个行键,它在HBase中以字典序的方式存储。由于RowKey是HBase表的唯一标识,因此Row Key的设计非常重要。
Column(列):HBase表的列是由列族名、限定符以及列名组成的,其中“:”为限定符。创建HBase表不需要指定列,因为列是可变的,非常灵活。
Column Family(列族):在HBase中,列族由很多列组成。在同一个表里,不同列族有完全不同的属性,但是同一个列族内的所有列都会有相同的属性,而属性都是定义在列族上的。
Timestamp(时间戳):表示时间戳,记录每次操作数据的时间,通常记作数据的版本号。
HBase的集群部署
HBase中存储在HDFS中的数据是通过Zookeeper协调处理的。由于HBase存在单点故障问题,因此通过Zookeeper部署一个高可用HBase集群来解决。以三台服务器为例(hadoop01、hadoop02和hadoop03),讲解HBase集群的安装部署,HBase集群的具体规划为hadoop01和hadoop02是主节点,hadoop02和hadoop03是从节点。
HBase HA集群部署
- 安装JDK、Hadoop以及Zookeeper,这里我们设置的JDK版本是1.8、Hadoop版本是2.7.4及Zookeeper的版本是3.4.10。
- 下载HBase安装包。这里选择下载的版本是1.2.1。
- 上传并解压HBase安装包。将HBase安装包上传至Linux系统的指定目录并进行解压。
- 将/hadoop-2.7.4/etc/hadoop目录的hdfs-site.xml和core-site.xml配置文件复制一份到/hbase-1.2.1/conf目录下。
- 在hbase-env.sh、hbase-site.xml、regionservers、ackup-masters、profile配置文件中添加参数。
- 将HBase的安装目录分发至hadoop02、hadoop03服务器上。
- 启动Zookeeper和HDFS服务。
- 执行“start-hbase.sh”命令,启动HBase集群。
- 通过“jps”命令检查HBase集群服务部署是否成功。
- 访问http://hadoop01:16010,查看HBase集群状态。服务器hadoop01是HBase主节点,服务器hadoop02和hadoop03是从节点。
HBase的基本操作
HBase的Shell操作
HBase Shell提供大量操作HBase的命令,通过Shell命令很方便地操作HBase数据库,如创建、删除及修改表、向表中添加数据、列出表中的相关信息等操作。当使用Shell命令行操作HBase时,需要进入HBase Shell交互界面,执行“bin/hbase shell”命令进入到目录/hbase-1.2.1的界面。
在HBase Shell交互界面中,可通过一系列Shell命令操作HBase,下面通过一张表列举操作HBase表常见的Shell命令。在HBase Shell交互界面中,可通过一系列Shell命令操作HBase,下面通过一张表列举操作HBase表常见的Shell命令。
HBase的Java API操作
HBase是由Java语言开发的,它对外提供了Java API的接口。下面,通过一个表来列举HBase常见的Java API。
深入学习HBase原理
HBase架构
HBase构建在Hadoop HDFS之上,Hadoop HDFS为HBase提供了高可靠的底层存储支持,Hadoop MapReduce为HBase提供高性能的计算能力,Zookeeper为HBase提供稳定服务和容错机制。HBase的整体架构如下所示。
Client:即客户端,它通过RPC协议与HBase通信。
Zookeeper:即分布式协调服务,在HBase集群中的主要作用是监控HRegionServer的状态。
HMaster:即HBase的主节点,用于协调多个HRegion Server,主要用于监控HRegion Server的状态以及平衡HRegion Server之间的负载。
HRegion Server:即HBase的从节点,它包括了多个HRegion,主要用于响应用户的I/O请求,向HDFS文件系统读写数据。
HRegion:即HBase表的分片,每个Region中保存的是HBase表中某段连续的数据。
Store:每一个HRegion包含一或多个Store。每个Store用于管理一个Region上的一个列族。
MemStore:即内存级缓存,MemStore 存放在store中的,用于保存修改的数据(即KeyValues形式)。
StoreFile:MemStore中的数据写到文件后就是StoreFile,StoreFile底层是以HFile文件的格式保存在HDFS上。
HFile:即HBase中键值对类型的数据均以HFile文件格式进行存储。
HLog:即预写日志文件,负责记录HBase修改。当HBase读写数据时,数据不是直接写进磁盘,而是会在内存中保留一段时间。
物理存储1.Region在行方向上的存储方式
HBase表的数据按照行键RowKey的字典序进行排列,并且切分多个HRegion存储,存储方式如下所示。
2.HRegion的切分方式
每个Region存储的数据是有限的,如果当Region增大到一个阀值(128)时,会被等分切成两个新的Region,切分方式如下所示。
3.HRegion的分布方式
一个HRegion Server上可以存储多个Region,但是每个Region只能被分布到一个HRegion Server上,分布方式如下。
4.HBase表的存储方式
MemStore中存储的是用户写入的数据,一旦MemStore存储达到阈值时,里面存储的数据就会被刷新到新生成的StoreFile中(底层是HFile),该文件是以HFile的格式存储到HDFS上,具体存储方式如下所示。
寻址机制
当HBase表查询数据遵循的是寻址机制,接下来,通过一张图来学习一下HBase的寻址机制,具体如下所示。
Zookeeper中存储的是ROOT表的数据,而ROOT表中存储的是META表的Region信息,也就是所有RegionServer的地址。
寻址机制
1.Client访问ZooKeeper请求行键rk001数据所在RegionServer地址。
2.Zookeeper从 --ROOT-表中查询所有表的.MATA.信息。
3…META.表将具体存储行键rk001数据的RegionServer的地址返回给Client。
4.Client获取到地址后,向该RegionServer发送查询行键为rk001这条数据请求,RegionServer收到请求,就查询行键rk001的Region。
5.RegionServer将行键为rk001这条数据的所有信息返回给Client。
HBase读写数据流程
1.读数据流程
- Client通过ZooKeeper、“-ROOT-”表及“.META.”表来找到目标数据所在的RegionServer地址。
- Client通过请求RegionServer地址来查询目标数据。
- RegionServer定位到目标数据所在的Region,然后发出查询目标数据的请求;
- Region先在MemStore中查找目标数据,若查找到则返回;若查找不到,则继续在StoreFile中查找。
2 . 写数据流程 - Client根据行键RowKey找到对应的Region所在的RegionServer。
- Client向RegionServer发送提交写入数据的请求。
- RegionServer找到目标Region。
- Region检查数据是否与Schema一致。
- 若Client没有指定版本,则获取当前系统的时间作为数据版本。
- 将更新的记录写入预写日志HLog和MemStore中。
- 判断 MemStore是否已满,若满则进行flush操作,将数据写入StoreFile文件,反之,则直接将数据存入MemStore。
HBase和Hive的整合
在实际业务中,由于HBase不支持使用SQL语法,因此我们操作和计算HBase分布式数据库中的数据是非常不方便的,并且效率也低。由于Hive支持标准的SQL语句,因此,我们可以将HBase和Hive进行整合,通过使用Hive数据仓库操作HBase分布式数据库中的数据,以此来满足实际业务的需求。
通过一个整合Hive和HBase的例子,实现Hive表中插入的数据可以从HBase表中获取的需求,具体步骤如下:
1.环境搭建。在服务器hadoop01上执行命令“vi /etc/profile”,配置Hive和HBase的环境变量。
2.导入依赖。将目录/hbase-1.2.1/lib下的相关依赖复制一份到目录/apache-hive-1.2.1-bin/lib下。
3.在hive-site.xml配置文件中,添加Zookeeper集群地址和指定其端口号,执行“source /etc/profile”命令使环境变量配置文件生效。
4.启动相关的服务。启动Zookeeper、Hadoop、 MySQL、Hive以及HBase服务。
5.新建Hive表。在Hive数据库创建hive_hbase_emp_table表,实现Hive与HBase整合。
6.创建Hive临时中间表。由于不能将数据直接插入与HBase关联的Hive表hive_hbase_emp_table中,所以需要创建中间表emp。
7.插入数据。向临时中间表emp插入数据,再通过insert命令将临时中间表emp中的数据导入到hive_hbase_emp_table表中。
8.查看hive_hbase_emp_table表和hbase_emp_table表的数据是否一致,则来判断HBase和Hive是否整合成功。