学习目标: ● 了解HBase的基础知识,能够说出HBase的特点和数据模型。 ● 熟悉HBase架构,能够叙述HBase中各组件的作用。 ● 了解物理存储,能够说出HBase如何存储数据。 ● 熟悉HBase读写数据流程,能够叙述HBase读写数据的流程。 ● 掌握HBase高可用集群的搭建,能够独立完成HBase高可用集群的搭建。 ● 掌握HBase的Shel 操作,能够使用HBaseShel 操作HBase。 ● 掌握HBase的JavaAPI操作,能够使用JavaAPI操作HBase。 ● 掌握HBase集成Hive,能够实现通过Hive向HBase的数据表插入数据。 在分布式计算环境下,Spark可以将处理后的数据实时写入HBase数据库,以满足对大 规模数据存储和快速访问的需求。HBase是一种面向列的分布式数据库,专为处理海量数 据而设计。与传统的行式数据库(如MySQL和Oracle)不同,HBase的列式存储允许灵活 地添加新的列,从而轻松适应不断变化的数据结构。这种特性使得Spark能够将实时计算 结果高效地存储到HBase中。本章详细讲解HBase分布式数据库的相关知识。 5.1 HBase的基础知识 5..ae的简介 11 HBs “沉淀”往往是通过对技术实践和经验的总结和提炼,形成深刻的认识和经验,从而提高 技术水平和解决实际问题的能力。HBase起源于Google公司发表的BigTable论文,它是 一个高可靠性、高性能、面向列、可扩展的分布式数据库。HBase的目标是存储并处理大型 的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的 大型数据。HBase具有如下的显著特点。 (1)容量大。HBase中的表可以存储成千上万的行和列组成的数据。 (2)面向列。HBase是面向列的存储,支持独立检索。面向列的存储是指其数据在表 中是按照某列存储的,根据数据动态地增加列,并且可以单独对列进行各种操作。 (3)多版本。HBase中表的每个列的数据存储都有多个版本。例如,存储个人信息的 HBase数据表中,如果某个人多次更换过家庭住址,那么记录家庭住址的数据就会有多个 版本。 144 Spark大数据分析与实战(第2版) (4)稀疏性。由于HBase中表的列允许为空,并且空列不会占用存储空间,所以表可 以设计得非常稀疏。 (5)扩展性。HBase的底层依赖于HDFS 。当磁盘空间不足时,可以动态地增加服务 器,即增加DataNode节点,以增加磁盘空间,从而避免像MySQL 数据库那样,进行数据 迁移。 (6)高可靠性。由于HBase底层使用的是HDFS,而HDFS 本身会备份数据,所以在 HBase出现宕机时,HDFS 能够保证数据不会发生丢失或损坏。 5.1.ae的数据模型 2 HBs HBase的数据存储在行列式的表格中,是一个多维度的映射模型,其数据模型如图5-1 所示。 图5- 1 HBase的数据模型 从图5-1可以看出,图中包含了很多的字段,这些字段分别表示不同的含义,具体介绍 如下。 1.RwKey(行键)RowK(o) ey表示行键,是HBase数据表中的每行数据的唯一标识符。在HBase中,Row Key按照字典顺序进行存储,因此,设计一个好的RowKey对于数据的存储和检索至关重 要。RowKey是检索数据的主要方式之一,通过设计高效的RowKey,可以更快地检索到 所需的数据,避免全表扫描或不必要的数据查找。此外,良好的RowKey设计还可以确保 相关的数据存储在一起,从而减少磁盘寻址时间,提高检索速度。 2.Timestamp(时间戳) Timestamp表示时间戳,记录每次操作数据的时间,通常作为数据的版本号。 3.Column(列) 列由列族和列标识两部分组成,两者之间用“:”分隔。例如在列族info中,通过列标识 name 标识的列为info:name 。创建HBase数据表时不需要指定列,因为列是可变的,非常 灵活。 4.ColumnFaily(列族) 在HBase中,列(m) 族由多个列组成。在同一个表里,不同列族有不同的属性,但是同一个 列族内的所有列都会有相同的属性,因为属性定义在列族级别上。在图5-1中,c1,c2,c3均 为列族名。 第5章HBase分布式数据库145 5.2 深入学习HBase原理 在使用HBase之前,学习HBase原理可以更好地理解HBase。接下来,本节从HBase 架构、物理存储以及HBase读写数据流程详细讲解HBase原理。 5.2.ae架构 1 HBs HBase构建在Hadoop之上,Hadoop中的HDFS为HBase提供了高可靠的底层存储 支持,同时Hadoop中的MapReduce为HBase提供了高性能的计算能力,而ZooKeper为 HBase提供了稳定服务和容错机制。下面通过图5-2介绍HBase架构。 图5- 2 HBase架构 从图5-2可以看出,HBase包含多个组件。下面针对HBase架构中的组件进行详细 介绍。 (1)Client。即用户提交相关命令操作HBase的客户端,它通过RPC协议与HBase进 行通信。 (2)ZoKeper。即分布式协调服务,在HBase集群中的主要作用是监控HRegionServer 的状态,并将HRegionServer的状态实时通知给HMaster,确保集群中只有一个HMaster 在工作。 (3)HMaster。即HBase集群的主节点,用于协调多个HRegionServer,主要用于监控 HRegionServer的状态以及平衡HRegionServer之间的负载。除此之外,HMaster还负责 为HRegionServer分配HRegion。 在HBase中,如果有多个HMaster节点共存,提供服务的只有一个HMaster,其他的 HMaster处于待命的状态。如果当前提供服务的HMaster节点宕机,那么其他的HMaster 通过ZooKeper选举出一个激活的HMaster节点接管HBase的集群。 (4)HRegionServer。即HBase集群的从节点,它包括了多个HRegion,主要用于响应 用户的I/O请求,并与HDFS交互进行读写数据。 (5)HRegion。即HBase数据表的分片,每个HRegion中保存的是HBase数据表中某 146 Spark大数据分析与实战(第2版) 段连续的数据。 (6)Store。每个HRegion包含一个或多个Store。每个Store用于管理一个HRegion 上的列族。 (7)MemStore。即内存级缓存,MemStore存放在Store中,用于保存修改的键值对 (Key,Values)形式的数据。当MemStore存储的数据达到一个阈值时,默认为128MB,数 据就会被执行刷写操作,将数据写入StoreFile文件。MemStore的刷写操作是由专门的线 程负责的。 (8)StoreFile。MemStore中的数据写到文件后就是StoreFile,StoreFile底层是以 HFile的格式保存在HDFS 上。 (9)HLog(WAL )。即预写日志文件,负责记录HBase的修改。当HBase读写数据 时,数据首先会被写入HLog,然后再写入内存。这样,即使在写入内存之前出现故障,数据 仍然可以通过HLog进行恢复。 5.2.物理存储 2 HBase最重要的功能就是存储数据,下面从4方面详细介绍HBase的物理存储。 (1)HBase数据表的数据按照行键的字典顺序进行排列。 此外,数据还被切分多个HRegion存储,每个HRegion存储一 段连续的行键范围。存储方式如图5-3所示。 (2)多个HRegion在一个HRegionServer上存储。一个 HRegionServer上可以存储多个HRegion,但是每个HRegion 只能被分布到一个HRegionServer上,这种设计可以确保 HBase的数据在HRegionServer之间进行均衡分布,分布方式 如图5-4所示。 (3)动态切分HRegion。每个HRegion存储的数据是有 图5- 3 HBase数据表中数据限的,当一个HRegion增大到一定的阈值时,会被等切分成两 的存储方式个新的HRegion,保证数据均匀分布和存储的可扩展性,切分 方式如图5-5所示。 图5- 4 HRegion的分布方式 第5章HBase分布式数据库147 图5- 5 HRegion的切分方式 (4)写入数据到MemStore和刷写到StoreFile。MemStore中存储的是用户写入的数 据,一旦MemStore存储达到一定的阈值(默认为128MB)时,数据就会被刷写到新生成的 StoreFile中(底层是HFile),该文件是以HFile的格式存储到HDFS上,具体如图5-6 所示。 图5- 6 HBase数据表的存储 5.2.ae读写数据流程 3 HBs HBase读写数据需要依靠ZooKeper来实现,这是因为ZooKeper中存储了HBase中 ROOT表的位置信息,而ROOT表又存储了META表的HRegion信息以及所有HRegionServer 的地址。 下面介绍HBase读写数据的流程。 1.HBase写数据流程 HBase写数据是指Client向HBase的数据表写入数据,下面通过图5-7来了解HBase 写数据流程。 从图5-7可以看出,HBase写数据流程大概分为7个步骤,具体流程如下。 (1)Client向ZooKeper发送请求,获取META表所在HRegionServer的地址信息。 (2)ZooKeper将META表所在HRegionServer的地址信息返回给Client。 (3)Client访问对应的HRegionServer,获取META表记录的元数据,从而找到表对应 的所有HRegion,并根据Region存储数据的范围确定具体写入的目标HRegion。 (4)HRegionServer将META表记录的元数据信息以及目标HRegion的信息返回给 148 Spark大数据分析与实战(第2版) 图5- 7 HBase写数据流程 Client。 (5)Client将META表记录的元数据信息以及目标HRegion缓存到Client的Cache 中,方便下次写数据时可以直接访问。 (6)Client向HRegionServer发送数据,HRegionServer将得到的数据暂时存储在WAL 中,如果MemStore存储的数据达到刷写操作的阈值时,数据将被刷写到StoreFile中。 (7)一旦数据成功存储到StoreFile中,HRegionServer将存储完成的信息返回给 Client,完成数据写入过程。 2.HBase读数据流程 HBase读数据流程与写数据流程类似,下面通过图5-8来了解HBase读数据流程。 图5- 8 HBase读数据流程 从图5-8可以看出,HBase读数据流程大概分为7个步骤,与写数据流程不同的是,读 数据流程中的HRegionServer中多了BlockCache,BlockCache的作用是读缓存,即将读取 的数据缓存到内存中,提高读取数据的效率。HBase读数据具体流程如下。 (1)Client向ZooKeper发送请求,获取HBase中META表所在HRegionServer的地 址信息。 第5章HBase分布式数据库149 (2)ZooKeper将META表所在HRegionServer的地址信息返回给Client。 (3)Client访问对应的HRegionServer,获取META表记录的元数据,从而找到表对应 的所有HRegion,并根据Region存储数据的范围确定要读取的目标HRegion。 (4)HRegionServer将META表记录的元数据信息以及HRegion返回给Client。 (5)Client将接收到的META表记录的元数据信息以及HRegion缓存到Client的 Cache中,方便下次读数据时访问。 (6)Client向HRegionServer请求读取数据,HRegionServer在BlockCache、 MemStore和StoreFile中查询目标数据,并将查到的所有数据进行合并。 (7)HRegionServer将合并后的最终结果返回给Client。 【提示】ROOT表是HBase中的一个特殊表,它存储了META表的位置信息。在 HBase中,META表是一个描述表和HRegion分布的元数据表。META表中的每一行记 录都代表一个表或HRegion的元数据信息,包括表名、列族以及负责该HRegion的 HRegionServer的地址等。 5.3 搭建HBase高可用集群 在普通的HBase集群中会存在单点故障问题,例如,当主节点发生宕机时,整个集群将 无法正常工作,针对这样的问题,可以利用ZooKeper提供的选举机制部署一个高可用的 HBase集群来解决。这样即使主节点宕机,其他节点仍然可以正常工作,保证集群的稳 定性。 下面以虚拟机Hadoop1、Hadoop2和Hadoop3为例讲解如何搭建HBase高可用集群。 HBase高可用集群的规划方式如图5-9所示。 图5- 9 HBase高可用集群的规划 从图5-9可以看出,HBase高可用集群中虚拟机Hadoop1和Hadoop2是主节点,虚拟 机Hadoop2和Hadoop3是从节点。这里之所以将虚拟机Hadoop2既部署为主节点也部署 为从节点,目的是避免HBase集群主节点宕机导致的单点故障问题,同时也为了提高 HBase集群读写数据的效率。 接下来,分步骤讲解如何搭建HBase高可用集群,具体步骤如下。 Spark大数据分析与实战(第1 50 2版) 1.下载HBase安装包 本书使用的HBase版本为2.4.9,通过访问HBase官网,下载HBase安装包hbase-2.4. 9-bin.tar.gz。 2.上传HBase安装包 在虚拟机Hadoop1的/export/software目录执行rz命令,将下载好的HBase安装包上 传到虚拟机的/export/software目录。 3.安装HBase 通过对HBase安装包进行解压操作安装HBase,将HBase安装到存放安装程序的目 录/export/servers,在/export/software目录执行如下命令。 $ tar -zxvf hbase-2.4.9-bin.tar.gz -C /export/servers/ 4.配置HBase环境变量 分别在虚拟机Hadoop1、Hadoop2和Hadoop3执行“vi/etc/profile”命令编辑系统环 境变量文件profile,在该文件的尾部添加如下内容。 export HBASE_HOME=/export/servers/hbase-2.4.9 export PATH=$PATH:$HBASE_HOME/bin 成功配置HBase环境变量后,保存并退出系统环境变量文件profile即可。不过此时在 系统环境变量文件中添加的内容尚未生效,还需要分别在虚拟机Hadoop1、Hadoop2和 Hadoop3执行“source/etc/profile”命令初始化系统环境变量,使配置的HBase环境变量 生效。 5.修改配置文件 为了确保HBase高可用集群能够正常启动,必须对HBase的配置文件进行相关的配 置,具体步骤如下。 (1)在虚拟机Hadoop1中执行“cd/export/servers/hbase-2.4.9/conf”命令进入HBase 安装目录的conf目录,在该目录下执行“vihbase-env.sh”命令编辑hbase-env.sh配置文件, 在hbase-env.sh配置文件底部添加如下内容。 export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true" export JAVA_HOME=/export/servers/jdk1.8.0_241 export HBASE_MANAGES_ZK=false 上述内容添加完成后,保存并退出hbase-env.sh配置文件。关于上述内容的具体介绍 如下。 ● HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP:用于设置HBase在运行 时是否自动查找Hadoop 类路径,设置为true表示HBase在运行时不自动查找 Hadoop类路径。 ● JAVA_HOME:用于指定HBase使用的JDK,这里使用的是本地安装的JDK。 ● HBASE_MANAGES_ZK:用于指定HBase高可用集群主节点选举机制,设置为 false表示使用的是本地安装的ZooKeeper集群。 (2)在HBase安装目录的conf目录执行vihbase-site.xml命令编辑hbase-site.xml配 置文件,将hbase-site.xml配置文件的 标签中的默认内容修改为如下 第5章 HBase分布式数据库1 51 内容。 hbase.rootdir hdfs://hadoop1:9000/hbase hbase.cluster.distributed true hbase.zookeeper.quorum hadoop1:2181,hadoop2:2181,hadoop3:2181 上述内容修改完成后,保存并退出hbase-site.xml配置文件。关于上述参数的介绍具 体如下。 ● 参数hbase.rootdir用于指定HBase集群在HDFS上存储的路径。 ● 参数hbase.cluster.distributed用于指定HBase集群是否为分布式的,设置为true表 示指定HBase集群是分布式的。 ● 参数hbase.zookeeper.quorum 用于指定ZooKeeper集群中所有ZooKeeper服务的 地址。 (3)在HBase安装目录的conf目录执行viregionservers命令编辑regionservers配置 文件,将regionservers配置文件中的默认内容修改为如下内容。 hadoop2 hadoop3 上述内容表示在主机名为hadoop2和hadoop3的虚拟机Hadoop2和Hadoop3中运行 HRegionServer。上述内容修改完成后,保存并退出regionservers配置文件。 (4)在HBase安装目录的conf目录执行vibackup-masters命令编辑backup-masters 配置文件,在backup-masters配置文件中添加如下内容。 hadoop2 上述内容表示在主机名为hadoop2的虚拟机Hadoop2中运行备用的HMaster。上述 内容添加完成后,保存并退出backup-masters配置文件。 6.分发HBase安装目录 执行scp 命令将虚拟机Hadoop1 的HBase 安装目录分发至虚拟机Hadoop2 和 Hadoop3中存放安装程序的目录,具体命令如下。 #将HBase 安装目录分发至虚拟机Hadoop2 中存放安装程序的目录 $ scp -r /export/servers/hbase-2.4.9/ hadoop2:/export/servers/ #将HBase 安装目录分发至虚拟机Hadoop3 中存放安装程序的目录 $ scp -r /export/servers/hbase-2.4.9/ hadoop3:/export/servers/ 7.启动ZooKeeper和Hadoop 在启动HBase高可用集群之前,需要先启动ZooKeeper服务和Hadoop集群,具体命 令如下。 Spark大数据分析与实战(第1 52 2版) #在虚拟机Hadoop1、Hadoop2 和Hadoop3 上分别启动ZooKeeper 服务 $ zkServer.sh start #在虚拟机Hadoop1 上执行启动Hadoop 集群的命令 $ start-all.sh 8.启动HBase 在虚拟机Hadoop1上执行如下命令启动HBase集群。 $ start-hbase.sh 图5-10 查看HBase运行状态 如果要关闭HBase高可用集群,则在虚拟机 Hadoop1执行“stop-hbase.sh”命令即可。 9.查看HBase运行状态 分别在虚拟机Hadoop1、Hadoop2和Hadoop3 执行jps命令查看HBase运行状态,如图5-10所示。 从图5-10可以看出,虚拟机Hadoop1运行着 HBase的HMaster;虚拟机Hadoop2运行着HBase 的HMaster和HRegionServer;虚拟机Hadoop3运 行着HBase的HRegionServer,说明HBase 启动 成功。 10.通过WebUI查看HBase运行状态 HBase默认提供了16010端口用于通过Web UI查看HBase运行状态。分别在本地计算机的浏览 器输入http://hadoop1:16010 和http://hadoop2: 16010查看HBase集群运行状态,以及备用HMaster 的运行状态,如图5-11和图5-12所示。 从图5-11可以看出,虚拟机Hadoop1是HBase 的主节点,虚拟机Hadoop2和Hadoop3 是HBase 的从节点。 从图5-12可以看出,虚拟机Hadoop2运行着备 用HMaster,并且显示了当前激活状态的HMaster 运行在虚拟机Hadoop1。 HBase高可用集群的搭建相对简单,但在搭建 HBase高可用集群时仍然需要明白以细心严谨的态度对待这一过程的重要性。这不仅有 助于顺利完成HBase高可用集群的搭建,还能培养我们严谨的思维和端正的态度,为综合 发展打下坚实的基础。 多学一招:修改日志信息输出级别 默认情况下,HBase日志信息输出级别为INFO,这种情况下会输出大量冗余信息,为 了提高查看HBase运行时信息的便利性,建议将日志信息输出级别修改为ERROR,这样可 以减少不必要的输出,使日志信息更加简洁明了。 在虚拟机Hadoop1的HBase安装目录的conf目录执行vilog4j.properties命令编辑