1.HBase的集群架构
2.什么是Store模块 ?什么是Region?
3.Hbase读流程
读取数据的流程:
1) 客户端发起读取数据的请求, 首先会先连接zookeeper;
2) 从zookeeper中到 Hbase的meta 表在哪个RegionServer节点上;
说明: hbase:meta 是HBase专门用于存储元数据的表, 此表只会有一个Region,也就是说这个Region只能被一个RegionServer所管理
3) 连接Meta表对应的RegionServer节点, 从这个表中获取到 读取的表有哪些Region, 以及这些Region对应被哪些RegionServer所管理(存在哪个节点上),从而确认要操作的RegionServer
注意:
如果执行Scan, 返回这个表所有Region对应的RegionServer的地址
如果执行get, 返回查询rowkey对应Region所在RegionServer的地址
4) 连接对应的RegionServer, 从RegionServer中对应Region中读取数据即可
读取顺序: 先内存 —> blockCache(块缓存) ----> storeFile —> 大HFile
4.Hbase写流程
写入数据流程:
---------------先客户端写入流程------------------------
(1)由客户端发起写入数据的请求, 首先先连接zookeeper
(2)从zookeeper中到 Hbase的meta 表所在RegionServer节点;
(3)连接对应RegionServer节点, 从Meta表获取要写入数据的表有哪些Region, 以及每个Region所在RegionServer节点的地址(Region所在的所有节点地址), 然后根据Region的起始Rowkey 和 结束rowkey, 获取要写入数据的Region对应RegionServer的地址(Region写入数据对应范围的节点地址)
大白话: 查询写入到那个Region, 这个Region在哪个RegionServer节点上
(4) 连接对应RegionServer, 开始进行数据写入操作, 写入时, 先将数据写入到这个RegionServer的HLog, 然后将数据写入到对应的Store模块下的MemStore中(可能写入多个MemStore), 当这两个位置都写入成功的时候(HLog和MemStore都写入成功), 客户端认为数据写入完成了
---------------再服务端写入流程------------------------
异步操作: 上面客户端可能执行了多次后, 后续才会干活
-
随着客户端不断的写入操作, MemStore中数据会越来越多, 当MemStore的数据达到一定的阈值**(128M/1h)后, 就会启动flush刷新线程**, 将内存中数据"最终"刷新到HDFS上, 形成一个StoreFile文件
-
随着不断的进行Flush的刷新, 在HDFS上StoreFile文件会越来越多, 当StoreFlie文件达到一定的阈值(3个及以上)后,就会启动compact合并压缩机制, 将多个StoreFlie"最终"合并为一个大的HFile
-
随着不断的合并, HFile文件会越来越大, 当这个大的HFile文件达到一定的阈值("最终"10GB)后,就会触发Split机制, 将大的HFile进行一分为二的操作, 形成两个新的大HFile文件, 此时Region也会进行一分为二,形成两个新的Region, 一个Region管理一个新的大Hfile, 旧的大HFile和对应Region就会被下线