Hbase
今天的主要内容
-
Hbase角色的了解
HMaster
HRegionServer
-
Hbase中的组件及其作用
HLog
Region
Store
MemStore
HFile
-
Hbase架构
- 一张图
-
Hbase读写数据的流程(图一定要熟悉)
Hbase读数据流程
hbase写数据流程
一、Hbase角色的理解
1. HMaster
监控 RegionServer
处理 RegionServer 故障转移
处理元数据的变更
处理 region 的分配或移除
在空闲时间进行数据的负载均衡
通过 Zookeeper 发布自己的位置给客户端
2. RegionServer
负责存储 HBase 的实际数据
处理分配给它的 Region
刷新缓存到 HDFS
维护 HLog
执行压缩
负责处理 Region 分片
二、Hbase中的组件及其作用
HLog——Write-Ahead logs
Region
Store
MemStore
HFile
1. Write-Ahead logs
HBase 的修改记录
一个HRegionServer对应一个Hlog
Hlog中存放的是数据本身和对数据的操作
当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。
但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入内存中。
所以在系统出现故障的时候,数据可以通过这个日志文件重建。因为Hlog中存放的是数据本身和对数据的操作
2. Region
Hbase 表的分片
HBase 表会根据 RowKey 值被切分成不同的 region 存储在 RegionServer 中,在一个 RegionServer 中可以有多个不同的 region。
RegionServer对应着多张表,一张table又对应着多个Region,一个Region维护着一个区间的row key
3. Store
HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族(Column Family)。
一个Region中有多个Store
4. MemStore
就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL中之后,RegsionServer 会在内存中存储键值对。
一个store中对应着一个MemStore,当MemStore达到16k后,写出到队列,然后产生一个新的Memstore,存在队列中的memstore实例化对象会被写到HFile中,一个memstore对应一个HFile,因此,一个Store中有一个memstore,但是有多个HFile。
5. HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
是存储在HDFS中的。
由HregionServer进行定期合并的,HRegionServer通过调用HDFS的API进行HFile的合并。
三、Hbase架构
概念理解:
· Hbase是依赖于zookeeper和hdfs的
HBase 内置有 Zookeeper,但一般我们会有其他的 Zookeeper 集群来监管 master 和regionserver,Zookeeper 通过选举,保证任何时候,集群中只有一个活跃的 HMaster
-
zookeeper中存储了
HMaster和RegionServer状态信息
HBase中数据的元数据寻址地址,也就是-ROOT-表的地址,即-ROOT-表存在于哪个RegionServer上
HMaster与 HRegionServer 启动时会向 ZooKeeper 注册,存储所有 HRegion 的寻址入口,实时监控HRegionserver 的上线和下线信息。并实时通知给 HMaster,存储 HBase 的 schema 和 table元数据。
默认情况下,HBase 管理 ZooKeeper 实例,Zookeeper 的引入使得 HMaster 不再是单点故障。一般情况下会启动两个 HMaster,非 Active 的 HMaster 会定期的和 Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个 HMaster 反而增加了 Active HMaster 的负担。
一个 RegionServer 可以包含多个 HRegion,每个 RegionServer 维护一个 HLog,和多个 HFiles以及其对应的 MemStore。RegionServer 运行于 DataNode 上,数量可以与 DatNode 数量一致。
四、Hbase读数据的流程
1. 寻址流程
Client访问Zookeeper,获取-ROOT-表的元数据信息,即表位于哪个RegionServer,并向客户端返回此RegionServer的地址(交互一:Client与Zookeeper的交互)
Client通过获取到的RegionServer的IP去访问RegionServer(交互二:client和RegionServer·的交互)
Client接着读取RegionServer中的-ROOT-表的内容,获取到.META表的地址(交互三:client和-ROOT-的交互)
Client根据.META表的地址,访问.META表,获取到数据的元数据信息(交互四:client和.METAE的交互)
client根据获取到的数据的元数据信息,去访问对应的HRegionServer,然后扫描所在的MemeStore和storefile来查询数据(交互五:client和数据本身的交互)
2. 寻址流程细节
-ROOT-表无论多大,都只有一个Region,存放着多条.META表的元数据信息,
.META表中有多个Region,存放关于实际数据的元数据
一个Table对应多个Region,一个Region维护一部分的row key
3. 在Region中读取数据的具体流程
先到memstore中寻找,注意:memstore中存放的是用户最近写入的数据,如果没有,则去Blockcache中读取数据,注意:BlockCache中存放的是用户最近读取的数据。如果没有,则去HFile中进行读取
HFile中获取到数据以后,现在Blockcache中进行缓存,然后再返回给客户端
BlockCache中用到了LRUCache算法
五、Hbase写入数据流程
先访问zookeeper,确定当前将要写入的数据所对应的 RegionServer 服务器和 Region。
Client 向该 RegionServer 服务器发起写入数据请求,然后 RegionServer 收到请求并响应。
Client 先把数据写入到 HLog,以防止数据丢失。
然后将数据写入到 Memstore。
如果 Hlog 和 Memstore 均写入成功,则这条数据写入成功。在此过程中,如果 Memstore达到16kb,会把 Memstore 中的数据写到一个队列中。
当 Storefile 越来越多,会触发 Compact 合并操作,把过多的 Storefile 合并成一个大的
尖叫提示:因为内存空间是有限的,所以说溢写过程必定伴随着大量的小文件产生。