store 一个表中一个列对应一个store 分memstore(基于内存存放数据,每个memstore分配128m空间)和
storefile:是文件的硬盘存储,直接存储到HDFS 存入后被称为HFile
HLog HBase的日志机制 日志会存储在HDFS,在任何操作之前先记录到HDFS 所有的日志都是记录在一起的
HRegionserver只有一个Log文档
zookeeper HBase协调服务 1主备的选举和切换 保证集群只有一个Master 存储Hbase的元数据信息 记录当前集群存储的信息
HMaster Hbase的主节点
读写流程
公共流程 定位资源 定位RowKey对应RegionServer
0.96之前首先系统维护了两张表 -root-(一张普通的表但是由Hbase自己维护,记录meta存放位置) -meta-
认为ROOT表中只需要一个Region即可
系统只维护meta
Meta的位置由zookeeper维护
定位RowKey对应RegionServer
读取数据的流程
·寻址 -->RegionServer:node02
·开始和RegionServer建立连接 BlocaCache
这是每个RegionServer内部共享的一个一块区域
·构建RegionScanner 优先从MemStore(内存)读取数据如果找不到就去StoreFile总查找
但Storefile有很多个 内部有序 ,外部无序
·构建StoreScanner
·MemStoreScanner StoreFileScanner
Hbase写入流程
·寻址 RowKey对应的RegionServer node03:16020
·RegionServer 首先将DML的操作写入到日志 日志Hlog 再写入到MenStore CF(列族)
·MenStore 监听器监听Menstore(判断阈值128M)写入HDFS
snapshot 快照MenStoreOld
数据刷写时机
(1)内存占用达到512M(128*4)阻塞客户端的写入
(2)总内存*40%*95%整个RegionServer开始进行刷写
(3)Wal日志的阈值大小 插入数据--删除数据
(4)自定义刷写时间间隔
(5)命令的刷写
刷写的策略
1.1之前Memstore刷写 只要有一个写满了所有都会刷写(列族不要超过三个)
2.2之后Region中所有Mem都进行刷写 设置一个阈值 mem分两类
数据合并(数据刷写)
合并的时机
Menstore Flush Store的StoreFile文件进行判断 判断是否达合并的阈值(文件数量超过10个)
周期性的检测 默认定义一个合并的周期10000s 如果达到阈值也会检查文件数目 如果文件数目超过三个 ---》小合并 不超过3个-->检查最早的一次合并的时间--》如果超过7天会进行大合并
手动触发
合并的方式
minor(小型)选取一些小的,相邻的StoreFile将他们合并成一个更大StoreFile,仅仅只是合并,但是会处理TTL的数据
major(大型)将所有的StoreFile合并成StoreFile 清理三类无意义数据,被删除的数据,TTL过期数据 ,版本号超过设定版本的数据
合并的策略
选择进程
数据切分
当Region达到阈值时就会开始切分
切分原因 数据分配不均匀 compaction消耗严重 单点压力 读写性能 合并困难
切分时机 每次数据合并后发起一个requestSplit然后开始检查文件大小 10G
切分策略
·寻找切分点
·先找最大的Store然后再找最大的StoreFile,再找中心点的rowkey