重点掌握
1、掌握Hbase的读写流程
2、掌握Hbase的设计原则理解内容
1、Hbase写入数据的刷写、合并、切分机制 -28~35
2、Hbase的表优化策略 -43~46
3、Hbase的设计案例 -38~42
4、Hbase与MapReduce的相互读写 -47~48
5、Hbase与Hive的整合 -49
Client访问Zookeeper,获取hbase:meta的元数据,
元数据获取后加载到内存中
通过Rowkey信息,从元数据中查找Region的相关信息
RegionServer构建RegionScanner,一个RowKey的信息对应着一个RegionScanner(它是一个主键的总信息)
一个RegionScanner会生成多个storeScanner,这个主要和store的个数有关,而store的个数与列族的个数有关,一个列族对应着一个store
storeScanner会排序,生成最小堆StoreHeap:PriorityQueue< StoreScanner >
一个storeScanner会生成一个缓冲区memStore和多个StoreFileScanner,这个
Client访问Zookeeper,获取hbase:meta所在的RegionServer的节点信息
Client访问hbase:meta所在的RegionServer,获取hbase:meta记录的元数据后先加载到内存中,然后再从内存中根据需要查询的RowKey来查询出RowKey所在的Region的相关信息(Region在RegionServer中)
Client访问RowKey所在的RegionServer,发起数据读取请求
RegionServer构建RegionScanner,用于对该Region的数据检索
RegionScanner构建StoreScanner,用于对该列族的数据检索
多个StoreScanner合并构建最小堆(已排序的完全二叉树)StoreHeap:PriorityQueue
StoreScanner构建一个MemStoreScanner和一个或多个StoreFileScanner(数量取决于StoreFile的数量)
过滤掉某些能够确定要查询的RowKey一定不在StoreFile内对于的StoreFileScanner或MEMStoreScanner
经过筛选后留下的Scanner开始做读取数据的准备,将对应的StoreFile定位到满足RowKey的起始位置
将所有的StoreFileScanner和MemStoreScanner合并构建最小堆
从KeyValueHeap:PriorityQueue中经过一系列筛选后一行行的得到需要查询的KeyValue。
Region中所有的MemStore占用的内存超过相关阈值
整个RegionServer的MemStore占用内存总和大于相关阈值
WAL数量大于相关阈值
定期自动刷写
数据更新超过一定阈值
手动触发刷写
hbase> flush 'TABLENAME'
hbase> flush 'REGIONNAME'
hbase> flush 'ENCODED_REGIONNAME'
hbase> flush 'REGION_SERVER_NAME'
特别注意:
HBase 根据合并规模将 Compaction 分为了两类:MinorCompaction 和 MajorCompaction
Minor Compaction
Major Compaction
触发compaction的方式有三种:Memstore刷盘、后台线程周期性检查、手动触发。
Memstore刷盘
后台线程周期性检查
手动触发
承载了大量IO请求但是文件很小的HFile,compaction本身不会消耗太多IO,而且合并完成之后对读的性能会有显著提升。
线程池选择
合并策略选择
HBase 主要有两种 minor 策略: RatioBasedCompactionPolicy (0.96.x之前)和ExploringCompactionPolicy(当前默认)
RatioBasedCompactionPolicy(基于比列的合并策略)
ExploringCompactionPolicy策略(默认策略)
FIFO Compaction策略
Tier-Based Compaction策略(分层策略)
Stripe Compation策略(条纹策略)
执行文件合并
通过切分,一个region变为两个近似相同大小的子region,再通过balance机制均衡到不同 region server上,使系统资源使用更加均衡。
寻找切分点
开启切分事物
切分线程会初始化一个SplitTransaction对象,从字面上就可以看出来Split流程是一个类似于’事物’的过程,整个过程分为三个阶段:prepare-excute-rollback
行健不能改变,唯一可以改变的方式是先删除后插入
长度原则
越短越好的原因
如何保证唯一原则
保证唯一原则的原因