hbase架构1

上一篇 / 下一篇  2012-02-04 18:26:17 / 个人分类:分布式技术学习

hbase控制两类基础的文件类型:1种被用于WAL(write ahead log),另一种是真正的数据存储。这些文件主要是被HRegionServers操作。在一些特殊情况,HMaster 将不得不处理底层文件的操作。而且真正的数据文件是被拆分成块存到HDFS上的(块的大小是可配置的)。
主要的通信流动是这样的:当一个新的客户端试图处理一个特定行时会先联系zookeeper。这样做是问了检索出-ROOT-的region在哪台机器上。如下:
[zk: localhost:2181(CONNECTED) 10] get /hbase/root-region-server
host:port(例如11.22.33.33:60020)
有了这些信息就可以去查询这台regionserver-ROOT-去找哪台机器上有这个key的.META.表,这些信息都是缓存着的查询会很快。
最后到相应的regionserver上查询.META.表来得到哪个region包含了这个表的这个行。
接着就会把这些信息缓存起来。

HMaster负责分配regions给每个HRegionServer,其中也包括-ROOT-和.META.。
HRegionServer 打开region并创建一个一致的HRegion对象,当HRegionServer被打开,他为每一个表的没一个列族建立一个Store实例。每个Store实例有一个或多个StoreFile 实例(其实是被简单包装的HFile),也有一个MemStore,并且每个HRegionServer有一个共享的HLog。
put操作:先将数据写到WAL,WAL是标准的hadoop SequenceFile(SequenceFile 是一个由二进制序列化过的key/value的字节流组成的文本存储文件,它可以在map/reduce过程中的input/output 的format时被使用。),它也存储HLogKey的实例。这些key包含序列号和真正的数据被用来当regioserver挂掉重做未持久化的数据。
一旦数据被写到WAL,它将被放到MemStore。同时会被检查MesStore是否满了,如果满了则写到硬盘会被请求。这个请求在HRegionServer中有一个独立的线程提供服务,它将会把数据写到hdfs上的一个新的HFile。它也会将最后写进去的序列号保存下来以便于系统知道持久化到哪一行了。

这里还有另外一个进行flush的原因:preflushing。当一个reionserver被要求stop,也会检查MemStore,在阻止访问这个region因为要执行最后一轮的flush以关闭主regions之前多于hbase.hregion.preclose.flush.size这个参数设置的大小(默认5M)的数据会先被flush到硬盘。
也就是说,在停止regionserver所有的MemStore都将被强制写到硬盘,不管有多少(即使比hbase.hregion.memstore.flush.size这个参数大)。
一旦所有的MemStores都flush了,regions就可以被关闭了,这样即使这些regions又被不同的regionserver重用也不需要后面的ligfile重做了。
额外用preflush可以扩展了regions的可用性:在preflush的时候regionserver和它的regions还是可用的。当剩下很小的MemStores的时候在第二轮被flush,regions才停止后面的服务。这一轮也可以检查所有的已经被preflush后才来的更改。

参考:HBase The Definitive Guide

TAG:

 

评分:0

我来说两句

Open Toolbar