✎ 学习目标

  1. 理解HBase的数据类型和架构
  2. 掌握HBase的集群部署
  3. 理解HBase读写数据流程
  4. 掌握HBase与Hive的整合

Spark计算框架是如何在分布式环境下对数据处理后的结果进行随机的、实时的存储呢?HBase数据库正是为了解决这种问题而应用而生。HBase数据库不同于一般的数据库,如MySQL数据库和Oracle数据库是基于行进行数据的存储,而HBase则是基于列进行数据的存储,这样的话,HBase就可以随着存储数据的不断增加而实时动态的增加列,从而满足Spark计算框架可以实时的将处理好的数据存储到HBase数据库中的需求。

HBase的概述

HBase的简介
HBase起源于2006年Google发表的BigTable论文。HBase是一个高可靠性、高性能、面向列、可伸缩的分布式数据库,利用HBase可在廉价PC服务器上搭建起大规模结构化存储集群。HBase的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。

HBase的特点:容量大 面向列 多版本 稀疏性 扩展性 高可靠性
HBase数据库和传统数据库的区别

  1. 存储模式
    传统数据库中是基于行存储的;而HBase是基于列进行存储的。
  2. 表字段
    传统数据库中的表字段不超过30个;而HBase中表字段不作限制。
  3. 可延伸性
    传统数据库中的列是固定的,需要先确定列有多少才会增加数据去存储;而HBase是根据数据存储的大小去动态的增加列,列是不固定的。

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处理数据库 简述hbase数据库_hadoop_02


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处理数据库 简述hbase数据库_数据库_03


在HBase Shell交互界面中,可通过一系列Shell命令操作HBase,下面通过一张表列举操作HBase表常见的Shell命令。在HBase Shell交互界面中,可通过一系列Shell命令操作HBase,下面通过一张表列举操作HBase表常见的Shell命令。

hbase处理数据库 简述hbase数据库_大数据_04


HBase的Java API操作

HBase是由Java语言开发的,它对外提供了Java API的接口。下面,通过一个表来列举HBase常见的Java API。

hbase处理数据库 简述hbase数据库_分布式_05


hbase处理数据库 简述hbase数据库_大数据_06

深入学习HBase原理

HBase架构

HBase构建在Hadoop HDFS之上,Hadoop HDFS为HBase提供了高可靠的底层存储支持,Hadoop MapReduce为HBase提供高性能的计算能力,Zookeeper为HBase提供稳定服务和容错机制。HBase的整体架构如下所示。

hbase处理数据库 简述hbase数据库_hadoop_07


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存储,存储方式如下所示。

hbase处理数据库 简述hbase数据库_hadoop_08


2.HRegion的切分方式

每个Region存储的数据是有限的,如果当Region增大到一个阀值(128)时,会被等分切成两个新的Region,切分方式如下所示。

hbase处理数据库 简述hbase数据库_大数据_09


3.HRegion的分布方式

一个HRegion Server上可以存储多个Region,但是每个Region只能被分布到一个HRegion Server上,分布方式如下。

hbase处理数据库 简述hbase数据库_hadoop_10


4.HBase表的存储方式

MemStore中存储的是用户写入的数据,一旦MemStore存储达到阈值时,里面存储的数据就会被刷新到新生成的StoreFile中(底层是HFile),该文件是以HFile的格式存储到HDFS上,具体存储方式如下所示。

hbase处理数据库 简述hbase数据库_大数据_11


寻址机制

当HBase表查询数据遵循的是寻址机制,接下来,通过一张图来学习一下HBase的寻址机制,具体如下所示。

hbase处理数据库 简述hbase数据库_hbase处理数据库_12


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是否整合成功。