缺点
a. 由于HBASE按照Row key来读写,不支持范围条件查询
b. 结构设计复杂,因此数据量少的时候,性能并不占优势
c. 不支持表的关联操作,并且聚合查询能力差
3.介绍下的HBase的架构
(1) Zookeeper
a. 保证HMaster的高可用;
b. 存储所有的HRegion的寻址入口;
c. 实时监控HRegionServer的上线和下线信息,并实时通知给HMaster;
d. 存储HBase的schema和table元数据;
e. Zookeeper Quorum存储-ROOT-表地址、HMaster地址
(2) HMaster
所有Region Server的管理者
a. 对于表的操作:create, delete, alter
b. 对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移
(3) HRegionServer
a. 对于数据的操作:get, put, delete
b. 对于Region的操作:splitRegion、compactRegion
(4) HFile
HBase中KeyValue数据的存储格式,
(5) HStore
存储核心由MemStore和StoreFile组成。StoreFile文件数量增长到阈值后会触发Compact合并操作,多个StoreFile合并为一个StoreFile,合并过程中会进行版本合并和数据删除。当单个StoreFile达到一定阈值后,会触发Split操作,将当前一个Regin分为两个Regin,父Regin下线,新Regin由HMaster分配到新ReginServer
(6) HLog(WAL)
每个HReginServer中有一个HLog,避免HBase意外宕机时,MemStore数据丢失。HLog定期删除已经持久化的数据。当HReginServer意外终止后,HMaster通过Zookeeper感知到,先处理遗留的HLog,将其中不同Regin的Log数据拆分,分发到相应的Regin目录下,然后再将失效的Regin重新分配,领取到这些Regin的HReginServer在Load Regin时发现有历史HLog需要处理,就将其中数据Replay到MemStore中,然后Flush到StoreFile,完成数据恢复
(7) HDFS
HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用的支持
(8) hbase-client
用来访问hbase集群
4.HBase的读写缓存
读缓存BlockCache
写缓存MemStore
5.在删除HBase中的一个数据的时候,它是立马就把数据删除掉了吗?
不是,只是将删除操作记录下来,在StoreFile文件比较多进行合并时,清理过期或者删除的数据。
6.HBase中的二级索引
(1)背景
HBASE中只有RowKey作为一级索引,在查询非RowKey数据时,需要通过MR或Spark等计算框架,效率特别低,并且特别消耗资源。
(2)原理
建立各列值与行键之间的映射关系。
(3)问题
索引和数据不一致。
参考:hbase–索引概念(含二级索引)_hbase索引-CSDN博客_hbase索引-CSDN博客")
7.HBase的RegionServer宕机以后怎么恢复的?
(1) HMaster检测到服务器宕机(通过Zookeeper);
(2) HLog切分,一个ReginServer只有一个HLog,因此要将HLog按照Regin进行切分,完成后Regin连同对应的HLog被HMaster分往新的ReginServer;
(3) 被分配了新的Regin的ReginServer根据HLog进行丢失数据的恢复,恢复完成后继续对外服务。
8.HBase的一个region由哪些东西组成?
有一个或多个Store,每个Store存放一个列簇;
每个Store由一个MemStore和0个或多个StoreFile组成。
9.HBase高可用怎么实现的?
**数据复制:**数据能够在不同的ReginServer之间进行复制;
**Zookeeper:**用于检测和管理各个节点的状态,并触发相应的操作;
**RegionServer自动恢复:**出现故障后,上面的数据会被HMaster发到其他ReginServer。
10.为什么HBase适合写多读少业务?
HBase存储引擎使用LSM树实现
- 写的时候先将数据存在内存中,达到阈值后再顺序写到磁盘上,避免了随机写;
- 读的时候,HBase只有rowkey索引,并且很难命中内存中数据,需要访问较多磁盘。
11.列式数据库的适用场景和优势?
适用场景:
a. 查询过程中,可针对各列的运算并发执行,在内存中聚合完整记录集,降低查询响应时间
b. 因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率
优势:
a. 列存模式下,只需要读取参与计算的列即可,极大的减低了IO花费
b. 同一列中的数据属于同一类型,压缩效果显著
适合OLAP系统
12.HBase的rowkey设计原则
(1)长度
Rowkey是一个二进制码流,太长浪费磁盘,并且MemStore中存储数据量也少建议10~100长度,最佳为16,因为64位操作系统内存8字节对齐,为8的整数倍最佳;
(2)散列原则
将RowKey高位字段作为散列字段,避免热点数据集中在一个ReginServer上;
(3)唯一原则
rowkey 是按照字典顺序排序存储的,因此可以将经常读到的数据放在一起。
13.HBase的rowkey为什么要唯一?
因为HBase是k-v存储,重复的话旧数据会被新数据覆盖
14.HBase的大合并、小合并是什么?
- 小合并(Minor Compaction)
合并相邻的StoreFile为一个较大的StoreFile
- 大合并(Major Compartion)
将所有StoreFile合并为一个StoreFile,伴随着数据的删除清理
15.HBase和关系型数据库(传统数据库)的区别(优点)?
(1)数据类型
HBase只有字符串存储,传统的关系型数据有着丰富的存储类型
(2)数据的操作
HBase只有表内数据的操作,没有表之间的关联
(3)存储方式
HBase是列式存储
(4)数据维护
HBase的修改和删除不是马上执行,操作后并不是第一时间内生效
(5)可伸缩性
HBase能够很容易的增加/减少节点
16.HBase为什么随机查询很快?
(1)只需要遍历相关Regin
(2)只需要遍历相关列簇
(3)先内存再磁盘
(4)根据key遍历
17.HBase的Get和Scan的区别和联系?
区别:
a. Get根据RowKey获取唯一值;
b. Scan按照指定的条件和顺序扫描表中的多行数据;
c. Get操作在内部对数据进行缓存,因此适用于对特定行的频繁读取。而Scan操作不会缓存数据,适用于一次性读取大量数据或按顺序遍历数据。
联系:
a. Get和Scan都可以使用过滤器(Filters)进行数据过滤,以便按照特定条件筛选所需的数据;
b. Get和Scan都可以选择返回的列族和列限定符,以获取特定的列数据。
18.HBase数据compact流程
(1) 触发
(2) 选择合并目标
(3) 合并:对选中的StoreFile进行归并排序,并进行合并,合并同时处理文件版本,时间戳等信息
(4) 清理:合并完成后,原有StoreFile会废弃,HBase会将其删除,并释放相应空间
(5) 更新元数据:Compaction完成后,HBase会更新相应的元数据信息
19.MemStore Flush条件
- MemStore达到阈值,所在regin都会flush
达到MemStore的4倍(默认),停止写入MemStore
- ReginServer中MemStore总大小达到阈值,全体flush
- 达到时间阈值,触发flush
- WAL文件数量超过阈值,regin整体flush
20.既然HBase底层数据是存储在HDFS上,为什么不直接使用HDFS,而还要用HBase
- HDFS更多的功能是大文件的存储,创建/删除文件,管理权限,对大文件的数据读取/追加。但是如果要对所存储的数据做修改/删除/插入/随机写,HDFS就做不到了
- HBase是基于HDFS进行超大数据集的分布式存储以及对数据的增删改查
21.HBase和Phoenix的区别
- Phoenix是HBase的开源SQL中间层,允许使用JDBC方式操作HBase上的数据
- HBase创建的表Phoenix看不到,Phoenix创建的表HBase能看到
- Phoenix具备二级索引
- Phoenix支持表之间的Join操作
22.HBase支持SQL操作吗
不直接支持传统SQL语句,使用自身API实现操作数据
23.HBase表设计
- 列簇设计在合理范围内能尽量少的减少列簇就尽量减少列簇数据保留的版本数数据保留时间
- rowkey设计预分区
主要解决热点问题,避免数据吞吐量过大时单个Regin负载过大
- rowkey长度不宜过大
- 唯一性原则
24.Region分配
- 任何时刻,一个Regin只能分给一个ReginServer
- Master记录了有哪些可用的ReginServer,以及当前有哪些Regin分配给了哪些ReginServer。当需要分配新的Regin,并且一个ReginServer有空间时,Master则会向ReginServer发送装载请求,ReginServer开始提供服务。
25.HBase的Region切分
(1)prepare阶段
在内存中初始化两个HReginInfo对象,包含tableName,reginName,startKey,endKey以及transaction journal用来记录切分的进展。
(2)execute阶段
a. RegionServer 更改ZK节点 /region-in-transition 中该Region的状态为SPLITING
b. Master通过watch节点/region-in-transition检测到Region状态改变,并修改内存中Region的状态
c. 在父存储目录下新建临时文件夹.split保存split后的daughter region信息
d. 关闭parent regin(会触发flush操作,确保数据全部落盘)
e. 核心分裂步骤:在.split文件夹下新建两个子文件夹,称之为daughter A、daughter B,并在文件夹中生成reference文件,分别指向父region中对应文件
f. 父region分裂为两个子region后, 将daughter A、daughter B拷贝到HBase根目录下,形成两个新的region
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
别指向父region中对应文件
f. 父region分裂为两个子region后, 将daughter A、daughter B拷贝到HBase根目录下,形成两个新的region
[外链图片转存中…(img-IhqDNlOz-1714673233413)]
[外链图片转存中…(img-4NIWRoXW-1714673233414)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!