hbase知识点
定义
Hbase 是一个分布式的、面向列的 NoSQL 数据库,是 Google BigTable 的开源实现,基于 Hadoop 和 Zookeeper 构建,可以提供海量结构化和半结构化数据的存储和随机访问。
NOSql和传统Sql的区别:
- 传统sql需要设计好结构化的建表语句,而NOSql不需要预先设计,想放什么字段,就放什么字段。
数据模型
Hbase 的数据模型类似于一个多维的稀疏表,由行键、列族、列限定符和时间戳组成。每个表可以有多个列族,每个列族可以有多个列限定符,每个单元格可以有多个版本,由时间戳标识。
存储架构
Hbase 的存储结构是基于 HDFS 的文件系统,
- 每个表被划分为多个 Region;
- 每个 Region 存储一部分行键的范围;
- 每个 Region 由一个或多个 Store 组成;
- 一个列族可以对应多个Store,但是一个 Store 只能对应一个列族。
Region的可分割性决定的,一个列族数据如果过大,就会分裂到不同Region的Store中。 - 每个 Store 由一个 MemStore 和多个 HFile 组成。
- MemStore 是一个内存缓冲区,用于存储写入的数据。
- HFile 是一个有序的、不可变的文件,用于存储持久化的数据。
读写流程
Hbase 的读写流程是通过客户端和 RegionServer 之间的 RPC 通信实现的。
写过程
- 客户端首先从 Zookeeper 或者客户端缓存中获取 Region 的位置信息;
从zk中找到Meta这张表的RegionServer分布,拿到Rowkey和RegionServer、Region的分布关系,并且会在客户端中缓存一份。 - 然后根据行键找到对应的 RegionServer;
- 再根据列族找到对应的 Store;
- 先使用WAL机制写入HLog(防止内存顺序写宕机导致数据丢失),存储在HDFS。
异常宕机后会用作恢复数据使用。 - 最后写入到 MemStore达到阈值或者定时flush到HFile中存到HDFS。
HLog主要是用于HBase灾难恢复用,数据以顺序写的方式追加到文件后边,因此写入效率堪比内存写入;其内容可以看成是MemStore内容的镜像;HBase写入的时候是先写入HLog,再写入MemStore的,顺序不能颠倒,两者都写入成功才算一次提交成功。 - 异步流程:HFile的合并,合并尽量手动控制。且在提供查询服务之前完成。
- 合并
- minor compact
一个region内部部分合并,合并的文件根据Hfile的年龄决定,年龄越大文件越小的越靠前被合并。不会清理被删除的数据、过期的数据、多余的版本。 - major compact
将一个store下的所有Hfile文件合并成一个Hfile,一般是禁用掉(默认七天合并一次)的然后手动执行(major_compact table_name)
- minor compact
读过程
- 客户端首先从 Zookeeper 或者客户端缓存中获取 Region 的位置信息;
从zk中找到Meta这张表的RegionServer分布,拿到Rowkey和RegionServer、Region的分布关系,并且会在客户端中缓存一份。 - 然后从Region中根据行键找到对应的 RegionServer;
- 再根据列族找到对应的 Store;
- 先从MemStore中查找数据;(B+树)
- 最后再从HFile中查找,查到则将读取的数据块缓存到 BlockCache 中,以便下次读取时可以直接从内存中获取,提高读取性能。
- 读请求会将从 MemStore、BlockCache 或者 HFile 中读取的数据进行合并,得到最终的结果,并返回给客户端。
-
为什么不是从MemStore中找到数据直接返回?
因为MemStore中的数据可能不全也有可能不是最新的,因为数据可能不经过他们直接通过bulkload将hfile导入到hbase中。
-
HFfile中数据的查找过程
三层B+树:跟索引、中间索引、叶子索引
跳跃三层树找到叶子节点的数据块,判断数据块是否在BlockCache中在的话直接返回,不在的话先返回然后存储到BlockCache中。
Block的大小默认为64KB
总结:
HBase有一个元数据表,叫做hbase:meta,它存储了每个Region的信息,包括表名,Region名,起始键,结束键,RegionServer地址,列族目录,StoreFile列表等。当用户查询一个表的数据时,HBase会先根据表名和Row Key在hbase:meta表中定位到对应的Region,然后根据列族名和Column Qualifier在Region中定位到对应的StoreFile,然后根据Timestamp和Version在StoreFile中定位到对应的HFile,然后根据HFile的索引和布隆过滤器在HFile中定位到对应的Block,然后从Block中读取对应的KeyValue。这样,HBase可以快速地找到用户需要的数据,而不需要遍历所有的Region和StoreFile。
HFile
快速找到文件的秘密
- 布隆过滤器
在判断文件中存在某个rowkey方面很在乎,因为哈希碰撞问题(判存很大概率会出现误判,但是判断不存在100%) - LSM
三层B+树:跟索引、中间索引、叶子索引 - 数据预加载到内存
读取到Hfile时就会加载:LRUBlockCache 是一种基于 LRU 算法的缓存,它存储在 JVM 内存中,主要用于缓存索引块和布隆过滤器块。
命中数据块时加载:BucketCache 是一种基于 SlabCache 设计的缓存,它存储在堆外内存中,主要用于缓存数据块。
Region 分割和HFile合并
HBase表按照行键的范围划分为多个Region,每个Region是一个数据分片,由一个RegionServer负责管理。一个Region在存储时,会将数据刷写到一个或多个HFile中,HFile是HBase的底层存储文件,它使用LSM树的结构来实现高效的读写。HFile是和列族(Column Family)对应的,如果一个表中有多个列族,那么一个Region就会对应多个HFile。
随着数据的不断写入,HFile的数量和大小会不断增加,这会影响HBase的读写性能,因此,HBase会定期对HFile进行合并(Compaction)操作,以减少文件数,提高数据本地化率,清理无效数据。HFile的合并分为两种类型,分别是Minor Compaction和Major Compaction。Minor Compaction是将部分小的、相邻的HFile合并成一个更大的HFile,这个过程不会清理无效数据,只是为了减少文件数。Major Compaction是将一个列族中所有的HFile合并成一个HFile,这个过程会清理被删除的数据、TTL过期数据、版本号超过设定版本号的数据,这样可以释放空间,提高查询效率。Major Compaction是一个耗时和耗费资源的操作,会影响集群性能,一般情况下都是做Minor Compaction,不少集群是禁止Major Compaction的,只有在集群负载较小时进行手动Major Compaction操作,或者配置Major Compaction周期,默认为7天。
另一方面, 当 region 中最大的 store 大小超过某个阈值 (hbase.hregion.max.filesize=10G) 之后就会触发切分 ,它就会被分裂成两个新的Region,这个过程是由RegionServer完成的,叫做Region Split。Region Split的目的是为了实现HBase的水平扩展,让数据分布到多台机器上,提高并发能力。Region Split的过程大致如下:
- 将需要拆分的Region下线,阻止所有对该Region的客户端请求,Master会检测到Region的状态为SPLITTING。
- 将一个Region拆分成两个子Region,先在父Region下建立两个引用文件,分别指向Region的首行和末行,这时两个引用文件并不会从父Region中复制数据。
- 之后在HDFS上建立两个子Region的目录,分别复制上一步建立的引用文件,每个子Region分别占父Region的一半数据。
- 复制登录完成后删除两个引用文件。
- 完成子Region创建后,向Meta表发送新产生的Region的元数据信息。
- 将Region的拆分信息更新到HMaster,并且每个Region进入可用状态。
HBase 有多种分割策略,可以根据 Region 的大小、数量、前缀等条件来触发分割,也可以手动指定分割点或强制分割。
- 分割可以提高数据的分布均衡性,避免出现数据倾斜和热点问题,影响读写性能和负载均衡。
- 分割可以提高数据的查询效率,减少扫描的范围和时间,提高并发度。
- 分割可以提高数据的可扩展性,支持海量数据的存储和访问,利用多台机器的资源。
分布式结构
Hbase 的分布式架构由三种角色组成:Master、RegionServer 和 Zookeeper。
- Master 负责管理表的元数据、负载均衡和故障恢复。
- RegionServer 负责处理客户端的请求、维护 Region 的生命周期和执行数据刷写和合并。
- Zookeeper 负责协调 Master 和 RegionServer 之间的状态信息和选举。
优化点
- 热点问题
- 预分区
- RowKey Hash 散列
本文作者:唐钰逍遥
本文链接:https://www.cnblogs.com/tyxy/p/17807284.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步