写点什么

Hbase 详解

用户头像
Fong
关注
发布于: 2021 年 03 月 07 日
Hbase详解

1、什么是 HBase?

HBase 是一个分布式,可扩展,面向列的适合存储海量数据的 NoSQL 数据库,其最主要的功能是解决海量数据下的实时随机读写的问题。 HBase 依赖 HDFS 做为底层分布式文件系统。

1、特性

  • 强读写一致,但是不是最终一致性的数据存储,这使得它非常适合高速的计算聚合

  • 自动分片,通过 Region 分散在集群中,当行数增长的时候,Region 也会自动的切分和再分配

  • 自动的故障转移

  • Hadoop/HDFS 集成,和 HDFS 开箱即用

  • 丰富、简洁、高效的 API

  • 块缓存,布隆过滤器,可以高效的列查询优化

  • 操作管理,Hbase 提供了内置的 web 界面来操作

2、什么时候用 Hbase?

Hbase 不适合解决所有的问题:

  • 首先数据库量要足够多,如果有十亿及百亿行数据,那么 Hbase 是一个很好的选择,如果只有几百万行甚至不到的数据量,RDBMS 是一个很好的选择。因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲的状态。

  • 其次,如果不需要辅助索引,静态类型的列,事务等特性,一个已经用 RDBMS 的系统想要切换到 Hbase,则需要重新设计系统。

  • 最后,保证硬件资源足够,每个 HDFS 集群在少于 5 个节点的时候,都不能表现的很好。因为 HDFS 默认的复制数量是 3,再加上一个 NameNode。

3、HBase 架构


zookeeper:开源分布式协调服务框架,主要解决分布式系统中的一致性和数据管理问题。本质上是分布式文件系统,做 HMaster 选举,关键信息如 meta-region 地址,Replication 进度,Regionserver 地址与端口等存储。

HMaster: 是一个轻量级进程,负责所有 DDL 操作,负载均衡, region 信息管理,并在宕机恢复中起主导作用。

HRegionServer: 管理 HRegion,与客户端点对点通信,负责实时数据的读写(DML 操作)。RegionServer 要实时的向 HMaster 报告信息。HMaster 知道全局的 RegionServer 运行情况,可以控制 RegionServer 的故障转移和 Region 的切分。

HRegion:Hbase 表的分片,HBase 表会根据 RowKey 值被切分成不同的 Region 存储在 RegionServer 中,在一个 RegionServer 中可以有多个不同的 Region。

Store:一个 Store 对应 HBase 表中的一个列族(Column Family)。

MemStore:内存存储,位于内存中,用来保存当前的数据操作。

HFile:在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile 是以 Hfile 的形式存储在 HDFS 的。

HDFS:Hbase 运行的底层文件系统。

Write-Ahead logs:HBase 的修改记录,当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。


2、HBase 工作流程

1、数据写流程

1、client--->zk 请求 meta 表所在的 RegionServer 机器地址

2、client<---zk 返回存放 meta 表的 RegionServer 机器地址

3、client--->RegionServer 请求 meta 数据信息

4、RgionServer--->client 返回 meta,获取存放用户数据的 RegionServer 机器

5、将 meta 进行缓存,下一次查询先查询缓存

6、发送 put 请求到对应的 RegionServer(反馈 client 写入成功)

7、对表加锁、更新时间戳、构建 WAL,将操作追加到 WAL 中

8、将数据写到 MemStore 中,释放锁

9、将数据同步到 StoreFile 中(如果同步失败,清理 Memstore 中的数据)


meta 表中存放用户表的信息

客户端访问 zk 中的 meta-region-server,返回对应机器

[root@test-194 bin]# ./zkCli.sh
[zk: localhost:2181(CONNECTED) 3] ls /hbase[backup-masters, draining, flush-table-proc, hbaseid, master, master-maintenance, meta-region-server, namespace, online-snapshot, rs, running, splitWAL, switch, table]
[zk: localhost:2181(CONNECTED) 4] get /hbase/meta-region-server�master:16000�<�ǂ���PBUF
test-194�}膃��.
复制代码

查询到对应机器

hbase(main):001:0> scan 'hbase:meta'
test01,,1614519617795.e069935707 column=info:seqnumDuringOpen, timestamp=2021-02-28T21:40:18.339, value=\x00\x00\x00\x00\x00\x00\ f5d924f222e2ff38b2cc8c. x00\x02 test01,,1614519617795.e069935707 column=info:server, timestamp=2021-02-28T21:40:18.339, value=test-194:16020 f5d924f222e2ff38b2cc8c. test01,,1614519617795.e069935707 column=info:serverstartcode, timestamp=2021-02-28T21:40:18.339, value=1614217790312 f5d924f222e2ff38b2cc8c. #数据表还小,没有分割,所以只有一台regionserver test-194,(rk0-xxx:regionserver) test01,,1614519617795.e069935707 column=info:sn, timestamp=2021-02-28T21:40:18.083, value=test-194,16020,1614217790312 f5d924f222e2ff38b2cc8c. test01,,1614519617795.e069935707 column=info:state, timestamp=2021-02-28T21:40:18.339, value=OPEN f5d924f222e2ff38b2cc8c.
复制代码

老版本的 HBase 可能存在-root-表,存放 meta 表的对应机器,作用:防止 meta 发生切分到不同的 RegionServer。(版本 0.9)

2、HBase 的 Flush

内存在一定条件下 flush:时间、大小(将写入 MemStore 中的数据刷写入 HFile 中)

相关配置

当 RegionServer 中所有的 MemStore 中的大小超过内存的 40%时 flush(阻塞状态,client 不可写入内存)

<property>	<name>hbase.regionserver.global.memstore.size</name>	<value></value></property>
复制代码

当 RegionServer 中所有的 Memstore 中的大小超过内存的 40%*95%时开始 flush(client 可以写入内存),刷写时会对 memstore 进行排序

<property>	<name>hbase.regionserver.global.memstore.size.lower.limit</name>	<value></value></property>
复制代码

内存中的文件自动刷新之前能够存活的最长时间,默认 1h(最后一次编辑时间,全部 flush)

<property>	<name>hbase.regionserver.optionalocacheflushinterval</name>	<value>3600000</value></property>
复制代码

单个 Region 中的 Memstore 中的缓存大小达到 128M(默认),当前 Region 就会 flush

<property>	<name>hbase.hregion.memstore.flush.size</name>	<value>134217728</value></property>
复制代码

当 WAL 文件的数量超过hbase.regionserver.max.log时,Region 会按照时间顺序一次进行刷写,直到 WAL 低于hbase.regionserver.max.log 以下,默认最大值为 32(不暴露在用户配置文件中了)

3、HBase 的 Compact

以牺牲磁盘 io 来换取读性能的稳定

小合并(minor):一个 Region 下一个 Store 中的部分 HFile 合并成一个比较大的 StoreFile。

大合并(major):一个 Region 下一个 Store 中的所有 HFile 合并成一个更大的 HFile。会清理 ttl 过期,版本超限定,标记删除的数据。


Compact 流程

1、触发条件(1、每次 memstore 在 flush 之后都会判断是否触发 Compaction。2、后台线程周期性检查。3、手动触发)

2、分别读出待合并 Hfile 文件的数据(K,V),进行归并排序,之后写到./tmp 临时文件中。

3、将临时文件移动到对应的 Store 的数据目录。

4、将 Compaction 的输入文件路径和输出路径封装成 KV 写入到 HLog 日志,并打上 Compaction 标记,最后强制执行 sync。

5、将对应的 Store 数据目录下的 Compaction 输入文件全部删除。


相关配置

在 Region 下的所有 hfile 会进行合并,默认为 7 天,majorcompaction 非常消耗资源,建议关闭(设置为 0)

<property>	<name>hbase.hregion.majorcompaction</name>	<value>604800000</value></property>
复制代码

合并是 rewrite(重写),由于时间不确定,万一在负载较高的情况下,容易出现问题,选择合适时间进行手动合并。

合并数量限制,3 >= hfile(默认 3 个)触发合并

<property>	<name>hbase.hstore.conpactionThreshold</name>	<value>3</value></property>
复制代码

4、HBase 的 split

根据 rowkey 进行切分,从 rowkey 中间进行切分。自动切分容易产生数据倾斜(所以建表的时候需要进行预分区)。官方建议使用 1--3 个列族(防止出现小文件)(使用多个列族需要数据量同步增长的情况下使用)。

Hfile 最大 10G(默认)

<property>	<name>hbase.hregion.max.filesize</name>	<value>10737418240</value></property>
复制代码

5、数据读流程

1、client--->zk 请求 meta 表所在的 RegionServer 机器地址

2、client<---zk 返回存放 meta 表的 RegionServer 机器地址

3、client--->RegionServer 请求 meta 数据信息

4、RgionServer--->client 返回 meta,获取存放用户数据的 RegionServer 机器

5、将 meta 进行缓存,下一次查询先查询缓存

6、访问存储用户的 RegionServer 中的 Memstore 和 StoreFile 中的数据,进行对比返回最大时间戳的数据

3、Hbase 基础命令


发布于: 2021 年 03 月 07 日阅读数: 26
用户头像

Fong

关注

还未添加个人签名 2019.10.16 加入

还未添加个人简介

评论

发布
暂无评论
Hbase详解