1. HBase简介 1.1 HBase介绍 Apache HBase是一个开源的 分布式 NoSQL数据库 ,支持 对海量数据的随机、实时的读写访问 ,能够在普通硬件集群上管理非常大的数据表,HBase基于Google的 Bigtable模型实现,HBase继承了Bigtable的 分布式、可扩展 的特性并实现 基于HDFS 之上进行数据存储 。
1.2 HBase特点及使用场景 HBase官网:https://hbase.apache.org,HBase有如下特点: 分布式、可扩展、高可靠、高性能的NoSQL数据库。
数据表可支持数十亿行、数百万列。
表数据支持多版本,可存结构化和非结构化数据。
分布式数据存储,基于HDFS进行数据存储。
支持随机、实时读写访问数据。
支持Shell、Java API 访问,不支持SQL,可通过第三方插件实现支持SQL。
HBase适合海量数据存储、低延迟读写、并发读写数据场景,在大数据开发中一般作为维度数据存储、实时数据写入/查询组件。
2. HBase表存储结构 HBase中有NameSpace(命名空间)概念,NS相当于关系型数据库中的DataBase,每个命名空间下可以有多个表,Hbase默认自带的命名空间hbase和default;hbase中存放的是HBase内置的表,default是用户默认使用的命名空间。
HBase中定义表及表存储结构与关系型数据库中不同,HBase中定义表时只需要声明列族(Column Family)即可,不需要声明具体的列,且 HBase表中数据存储是稀疏的 ,操作HBase表时可以 根据需要进行列的动态增减 。
为了快速理解HBase表存储结构,这里将HBase表存储结构分为表逻辑结构和表物理结构两个部分介绍。
2.1 表逻辑结构 HBase表逻辑结构描述了数据在HBase表中组织方式 。
表逻辑结构图如下: RowKeyColumn FamilyColumn FamilyColumnQualifierColumnQualifierColumnQualifierColumnQualifierrowkeycellcellcellcellrowkeycellcellcellcell... ... 通过上图可以看到HBase中一条数据由一个rowkey和多个Column组成,以上HBase表逻辑结构图的名词解释如下: 行键(rowkey):用来表示表中唯一的一行数据,以字节数组形式存储, rowkey在HBase中按照字典序排序存储 ,使用HBase时,用户只能根据rowkey获取对应的cell数据。
列族(Column Family):列族是HBase表中逻辑分组单元,一个列族包含多个列限定符(Column Qualifier),通常将相同类型数据放入同一个列族中。
列限定符(Column Qualifier):列限定符是列族中的一个列,不同的列族可以有不同的列限定符,列限定符可以是任意字符串(如:cf1:name,cf1:age)。
单元格(cell):单元格是HBase数据的基本存储单元。
每个单元格包含一个列族、列限定符、时间戳以及对应的值。
单元格中的数据没有类型的概念,而是以字节序列的形式存储 (字符串正常存储,非字符串类型数据底层字节序列会转换成十六进制显示)。
每个列族中的列可以存储多个版本的数据,每个版本由其对应的时间戳标识,并且每个版本的值都构成一个单元格。
2.2 表物理结构 HBase表物理结构描述了数据在底层存储的组织方式 。
在HBase中表数据存储并不是按照表逻辑结构进行存储,而是按照如下方式进行存储(以先前样例数据为例):
注意:在表逻辑结构中的空值在HBase底层不会进行存储。
以上HBase表物理结构图TimeStamp名词解释如下: 时间戳(Timestamp):用于标识数据的不同版本(version),每次对表进行写入操作时,都可以指定一个时间戳,如果不指定时间戳,则系统会自动生成一个时间戳。
通过{rowkey,ColumnFamily:ColumnQualifier,timestamp}来确定唯一的cell。
读取单元格Cell数据时也可以指定一个version版本,版本可以省略,如果不指定version,HBase默认会返回最新版本的数据,具体使用方式见后续章节。
区域(Region):HBase自动把表按照rowkey水平划分为多个区域(Region),每个Region会保存一个表里面某段连续的数据,这段连续数据对应有起始rowkey, 同一个rowkey不会被划分到不同的Region中 。
type:对于删除操作,其类型为DeleteColumn。
3. HBase架构
3.1 Client Client为访问HBase的客户端,包含访问HBase的接口并维护cache来加快对HBase的访问。
Client通过zookeeper获取hbase:meta表位置信息,然后获取要操作的Region信息并与该region的RegionServer通信,发出读取或写入请求。
获取的Region信息会缓存在客户端中,以便后续请求无需经过查找过程。
如果Master的负载均衡器重新平衡或者由于HRegionserver宕机,都会重新指定该region的regionserver,客户端将重新查询hbase:meta表以确定用户region的新位置。
注意:hbase:meta表为HBase的元数据表,其存储了HBase集群中所有表和Region的元数据信息,如:表结构、数据分布、HRegionServer位置。
3.2 Zookeeper HBase集群中zookeeper作用如下: 存储HBase元数据,如:HMaster信息、HRegionServer信息、表对应HMaster信息、hbase:meta表位置信息。
协调HMaster的HA。
通过zk保证HBase集群中只有一个HMaster运行,如果HMaster发生异常则通过zk选举新的HMaster提供服务。
监控RegionServer。
zk监控RegionServer状态,当RegionServer异常时,会通知给HMaster对应RegionServer上下线信息。
3.3 HMaster HMaster是HBase集群中的主节点,习惯上也可称为Master,一个HBase集群中可以有多个HMaster节点,由zk进行协调,保证只有一个HMaster运行,其余HMaster为Backup Master。
HMaster主要作用如下: 管理库表的元数据,如表对应Region信息,负责将Region分配给HRegionServer。
负责Region的负载均衡。
当写入数据时负责将数据均衡的分布到各个HRegionServer上,避免HRegionServer数据存储倾斜;当读取数据时,将请求均衡的发送到各个RegionServer上,避免HRegionSever负载过大。
通过zk发现失效的HRegionServer并重新分配该HRegionServer上的Region。
注意:HMaster只维护库表和region相关元数据,负责Region的分配及数据库的创建和删除等操作而不参与数据的读写操作, HMaster挂掉仅会导致所有的元数据无法被修改,但读写表数据还是可以正常进行。
HBase集群中HRegionServer负责数据读写操作。
3.4 HRegionServer HRegionServer可以看成HBase架构中的从节点,习惯上也可称为RegionServer,HBase集群中一般有多台HRegionServer,主要负责数据读写请求。
一个HRegionServer包含一个HLog和多个HRegion,每个HRegion中有包含多个Store,每个Store中又包含MemStore和StoreFile,下面分别介绍HRegionServer中内容。
WAL(HLog) WAL(Write-Ahead-Log)预写日志是HBase的HRegionServer在处理数据插入和删除过程中用来记录操作内容的一种日志,这里说的HLog就是WAL预写日志文件,该日志是保存在HDFS上的持久化文件。
HBase中每次进行数据操作时,数据达到Region前先写入到HLog文件,然后被加载到MemStore中,这样就算HRegionServer宕机了,后续操作没来得及数据持久化,也可以在重启HBase之后从HLog中恢复数据。
注意:一个HRegionServer中所有的Region共享一个HLog,默认HBase中开启WAL机制,不建议关闭,如果关闭WAL机制在进行增删改操作时会快一些,但有丢失数据风险。
HRegion HRegion习惯称为Region,HBase自动把表水平划分为多个区域(Region),每个Region会保存一个表里面某段连续的数据,这段连续数据对应有起始rowkey。
每个HBase表一开始只有一个Region,随着数据不断写入到表,Region不断增大,当增大到一个阈值的时候,Region就会被HRegionServer水平分为两个Region,当Table中行不断增多,会有越来越多的Region,这些Region会被HMaster分配到其他HRegionServer上。
HRegion是HBase中分布式存储和负载均衡的最小单元,最小单元就表示不同的Region可以分布在不同的 HRegion server上。
Store HRegion由一个或者多个Store组成,每个store保存一个Columns Family,表有几个列族就有几个Store。
每个Store又由一个MemStore和0至多个StoreFile组成,用户向Region中写入数据时,数据先写入MemStore,MemStore中的数据存储在内存中,当MemStore中的数据达到某个阈值(默认64MB),HRegionServer会启动Flush进程写入StoreFile,每次写入形成一个单独的StoreFile,StoreFile数据存储在磁盘中。
MemStore称为写缓存,HBase底层数据存储是按照rowkey字典序排序的,所以数据需要先存入到MemStore,排好序后等待刷写时机将数据最终写出到磁盘的StoreFile中,StoreFile底层以 HFile 的格式保存到HDFS中。
当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作,形成更大的storefile,当一个Region中所有StoreFile大小超过一定阈值后,会把当前的Region分割为两个,由HMaster分配到相应的HRegionServer进行负载均衡。
综上所述,HBase一张表会按照行rowkey进行划分成很多HRegion,这些HRegion分散到多个HRegionServer,每个HRegionServer中包含多个HRegion,每个HRegion包含多个Store,每个Store对应表中每个列族。
HRegionServer主要作用如下: 管理HMaster分配的Region,处理来自客户端的读写请求(如:put、get请求),定期向HMaster汇报Region状态。
负责Region变大拆分。
当一个Region的数据量增大到一定程度,HRegionServer负责将Region拆分为两个新的Region,实现数据均衡分布。
负责StoreFile合并。
负责与HDFS交互,将数据存储到HDFS中。
4. HBase集群搭建与启动 HBase搭建需要提前搭建好HDFS集群和zookeeper集群,HBase版本与HDFS版本有对应的版本匹配关系,可以通过https://hbase.apache.org/book.html查询(搜索“Hadoop version support matrix for active release lines”即可) 这里我们选择HBase版本选择 2.6.0 版本,提前搭建好了Hadoop 3.3.6版本HDFS集群。
HBase各个角色分布节点如下: 节点名称HBase服务 hadoop103RegionServerhadoop104HMaster1,RegionServerhadoop105HMaster2,RegionServer (1)将下载好的安装包发送到hadoo104节点上,并解压,配置环境变量
#将下载好的HBase安装包上传至hadoop104节点/opt/software下,并解压
[root@hadoop104 software]# tar -zxvf ./hbase-2.6.0-bin.tar.gz -C /opt/module
当前节点配置HBase环境变量
#配置HBase环境变量
[root@hadoop104 software]# vim /etc/profile.d/my_env.sh
# HBASE_HOME
export HBASE_HOME=/opt/software/hbase-2.6.0/
export PATH=$PATH:$HBASE_HOME/bin
#使环境变量生效
[root@hadoop104 software]# source /etc/profile
(2)配置$HBASE_HOME/conf/hbase-env.sh 在hadoop104节点配置$HBASE_HOME/conf/hbase-env.sh
#配置 HBase不使用自带的zookeeper
export HBASE_MANAGES_ZK=false
#Hbase中的jar包和HDFS中的jar包有冲突,以下配置设置为true,启动hbase不加载HDFS jar包
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true"
(3)配置$HBASE_HOME/conf/hbase-site.xml
在hadoop104节点配置$HBASE_HOME/conf/hbase-site.sh
hbase.rootdir
hdfs://mycluster/hbase
hbase.cluster.distributed
true
hbase.zookeeper.quorum
hadoop103,hadoop104,hadoop105
(4)配置$HBASE_HOME/conf/regionservers,配置RegionServer节点 在hadoop104节点配置$HBASE_HOME/conf/regionservers
hadoop103
hadoop104
hadoop105
(5)配置backup-masters文件
在hadoop104节点手动创建$HBASE_HOME/conf/backup-masters文件,指定备用的HMaster,需要手动创建文件,这里写入hadoop105,在HBase任意节点都可以启动HMaster,都可以成为备用Master ,可以使用命令:hbase-daemon.sh start master启动。
#创建 $HBASE_HOME/conf/backup-masters 文件,写入hadoop105
[root@hadoop104 conf]# vim backup-masters
hadoop105
(6)复制hdfs-site.xml到$HBASE_HOME/conf/下
在hadoop104节点执行如下命令:
[root@hadoop104 ~]# cp /opt/module/hadoop-3.3.6/etc/hadoop/hdfs-site.xml /opt/module/hbase-2.6.0/conf/
(7)将HBase安装包发送到node3,node5节点上,并在node3,node5节点上配置HBase环境变量 (8)启动HBase集群 启动zookeeper、HDFS集群后,在HBase hadoop104 HMaster节点上启动HBase集群,命令如下:
#启动HBase集群
[root@hadoop104 ~]# start-hbase.sh
HBase集群启动后,通过“http://hadoop104:16010”访问HBase集群WebUI。
如下:
5. HBase 数据目录
.hbck: 用于存放HBase的元数据校验生成的信息。
.tmp: HBase临时文件的存储位置。
当HBase进行数据操作时,会先将数据存放在.tmp目录下,然后将其移动到最终的位置。
MasterData: 该目录包含HBase HMaster维护的各种元数据信息,例如表和region的状态。
WALs: 预写日志(Write-Ahead Log, WAL)的存储位置,WAL记录了HBase写入操作的历史,用于在故障恢复期间重建数据。
archive: 该目录用于存放已删除或者过期的表和region信息。
corrupt: 该目录用于存放检测到的损坏的文件,HBase会在后台尝试修复这些文件,如果无法修复,则会将它们移到这个目录下。
data: HBase实际数据的存储位置,每个表都有自己的子目录,里面包含了该表的各个region的数据文件。
hbase.id: 这是一个文件,用于标识当前HBase集群的唯一ID。
hbase.version: 这是一个文件,用于记录HBase的版本号。
mobdir: HBase支持将小对象(较小cell数据)存储在一个单独的目录中,以提高读取效率。
该目录用于存放这些小对象数据。
oldWALs: 该目录用于存放旧版的WAL文件,当新的WAL格式引入后,旧版的WAL会被移动到这里,以便于后续的清理和归档。
staging: 该目录用于存放正在创建或更新的表的临时文件。
在这个过程中,HBase会将新表的元数据和数据文件暂存在这里,直到整个过程完成。
