跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

HBase概述及其部署

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会将新表的元数据和数据文件暂存在这里,直到整个过程完成。

相关文章