1 HBase 查找一条数据的过程 ?或者HBase工作机制?
参考:HBase 查找一条数据的过程 白话理解
1.hbase regionserver 向zookeeper注册,提供hbase regionserver状态信息(是否在线)
hmaster启动时候会将hbase 系统表-ROOT- 加载到 zookeeper cluster,通过zookeeper cluster可以获取当前系统表.META.的存储所对应的regionserver信息。
2.client访问zk,查找-ROOT表,获取.META.表信息
3.从.META.表查找,获取存放数据的region信息(找到region sever)
4.最后通过RegionServer获取查找的数据
其实,最后在查询数据的时候,会先查memstore,没有再查block cach,最后才查hfile的。
BlockCache:读取时先看是否命中内存,否则访问磁盘文件
备注:
META表管理的是实际创建的表的region信息,ROOT表管理的是META表的region信息
ROOT和META:它们是HBase的两张内置表,从存储结构和操作方法的角度来说,它们和其他HBase的表没有任何区别
RegionServer:RegionServer它一方面维护region的状态,提供对region的管理和服务(增删改查等),一方面跟Master交换,上传region的负载信息,参与Master的分布式协调管理(就是要负载均衡啦)。
HMaster主要作用在于,通过HMaster维护系统表-ROOT-,.META.,记录regionserver所对应region变化信息。此外还负责监控处理当前hbase cluster中regionserver状态变化信息。
简单的说:zookeeper是HBase的调度器,所有Client的访问首先会从zookeeper拿到一个session
ZK同时负责监控所有Region Server的健康状况~~
如果ZK每三分钟(可以配置)会监控一次RegionServer,如果发现某个RS挂了,ZK会通知HMaster,HMaster再去拉起那个挂掉的RS
2 Hbase存储一行数据的过程???
1、客户端提交写请求,先将数据写入缓存,判断缓存是否满,若满则提交数据。(3t)最后构建put与regionserver之间的映射,接下来批量提交给regionserver/查找region时是
2、客户端重构数据:定位put属于哪一个region,其次判断region属于哪个regionserver,最后构建put与regionserver之间的映射,接下来批量提交给regionserver。查找region时是根据当前的Rowkey与每个region的start rowkey和stop rowkey,因为hbase的行健是连续的,当前put的行健肯定会落在某一个region上。
3、客户端提交请求:客户端向各个regionserver并发提交写请求,使 线程池方式并等待结果,若有失败的结果加入队列重试。
4、服务器端根据region名字获得region对象,获取锁并更新时间戳,写入memstore,同时更新WAL日志。
3 Hbase删除一条数据的过程?
参考:Hbase资料
HBase的数据删除机制:当接收到数据删除指令后,系统并没有立即删除HFile中存储的数据,而是设置一个标志位标志其被删除(在HDFS中数据删除时被移到/trash文件夹缓冲区),此时系统会根据标志位响应客户端的访问请求,待系统的下一次大合并(major campaction)将被标志的数据块删除,这才算彻底的完成数据的删除。
设置标志位--->移植文件夹缓冲区--->大合并时彻底删除
4 Hbase的campaction介绍
主要起到如下几个作用:
1)合并文件
2)清除删除、过期、多余版本的数据
3)提高读写数据的效率
Minor & Major Compaction的区别:(小合并和大合并)
1)Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作。
2)Major操作是对Region下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。
5 Hbase的Log-Structured Merge Tree架构模式?
参考:
HBase源码之Compaction的执行策略分析
HBase Compaction解析
用户数据写入先写WAL,再写缓存,满足一定条件后缓存数据会执行flush操作真正落盘,形成一个数据文件HFile。随着数据写入不断增多,flush次数也会不断增多,进而HFile数据文件就会越来越多。然而,太多数据文件会导致数据查询IO次数增多,因此HBase尝试着不断对这些文件进行合并,这个合并过程称为Compaction。
Compaction会从一个region的一个store中选择一些hfile文件进行合并。
先从这些待合并的数据文件中读出KeyValues,再按照由小到大排列后写入一个新的文件中。之后,这个新生成的文件就会取代之前待合并的所有文件对外提供服务。
HBase根据合并规模将Compaction分为了两类:
- Minor Compaction是指选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,在这个过程中不会处理已经Deleted或Expired的Cell。一次Minor Compaction的结果是产生更少并且更大的StoreFile。
- Major Compaction是指将所有的StoreFile合并成一个StoreFile,这个过程还会清理三类无意义数据:被删除的数据、TTL过期数据、版本号超过设定版本号的数据。另外,一般情况下,Major Compaction时间会持续比较长,整个过程会消耗大量系统资源,对上层业务有比较大的影响。因此线上业务都会将关闭自动触发Major Compaction功能,改为手动在业务低峰期触发。
触发时机
HBase中可以触发compaction的因素有很多,最常见的因素有这么三种:
- Memstore Flush
- 后台线程周期性检查
- 手动触发。
6 BockCache???
Memstore主要用来写,BlockCache主要用于读
读请求先到Memstroe中查数据,查不到就到BlockCache中查,再查不出就会到磁盘上读,并把读的结果放到BlockCache中;
BlockCache采用的是LRU策略,当块缓存达到上限后,会启动淘汰机制,淘汰掉最老的一批数据。
疑惑:BlockCache是属于store的还是属于RegionServer的?
一个RegionServer上有一个BlockCache和N个Memstore
7 HBase二级索引???
HBase本身只提供基于行键和全表扫描的查询,而行键索引单一,对于多维度的查询困难(如:对于价格+天数+酒店+交通的多条件组合查询困难),全表扫描效率低下。
二级索引的本质就是建立各列值与行键之间的映射关系。