架构一
组件说明:
1,Client:
- 是Hbase的入口,增删改查都是从这里开始,对外提供一系列API
- 跟Zookeeper交互的目的是为了获取Region信息(老版本的ROOT—Meta 新版本里只有Meta),获得到了这个信息以后(会缓存起来,避免频繁跑到zookeeper来获取这些信息),就直接奔向Region Server,进行数据的增删改查。
- Client 是使用HBase RPC机制与HMaster 和HRegionServer 进行通信。
- Client 与 HMaster 之间只会进行管理类的操作。(架构图里面没有Client到HMater的连线,并不意味着他俩没有互动,在需要对数据表操作(数据表的新建 删除 修改)的时候Client就需要跟HMaster交互。)
- Client 与 HRegionServer会进行数据读写类操作。
- Client 对数据增删改查的实施目的地就是Region Server上面的Region。
2,Zookeeper:
- 避免HMaster单节点故障(HA,领导选举机制,保证系统里面有一台可用的Master)
- 管理HRegionServer和HMaster的注册信息
- 存贮Root(老版本)以及Meta的信息(Root中记录的是Meta的信息,Meta中记录的是Region的信息)
3,HMaster:
- 管理用户对表的增删改查操作,注意:重点是 表,而不是表中的数据。
- 管理HRegionServer的负载均衡,以及调整Region分布。
- Region Split以后(Region存储量达到一定的阈值),负责新Region分布。
- HRegionServer停机以后,负责失效HRegionServer上的Region的迁移。(还有疑问,HRegionServer都挂了,HBase从哪里知道这台Server上的Region信息?从目前的认知,暂时理解为Zookeeper,待验证)
4,HRegionServer:
- 核心模块,主要负责相应用户I/O请求,直接操作HDSF文件系统中的数据。
- HRegionServer管理的是一系列的HRegion对象,每个Region则对应的是Table中的一部分数据。
- HRegion 是由多个Store组成。
- 每个Store对应Table里面的一个Column Family存储。(需要在后面的实践中进一步验证)。
- Column Family 就是一个集中的存储单元,将具有相同I/O特性的Column放在一个Column Family里面会更高效。
HStore:
- 存储核心,组成部分为MenStore和StoreFile
- Client写入---》存储MemStore,达到阈值---》Flush成一个StoreFile,当StoreFile数量达到一定的阈值以后 ---》触发合并(Compact),使多个StoreFile合并成一个大的StoreFile,同时会进行版本合并以及数据删除 ---》当StoreFile,越来越大到超过一定的阈值以后 --》触发分割Split操作,把当前Region分割成2个Region,原先的Region会下线,新出来的两个Region会被HMaster重新分配到相应的HRegionServer上。(HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。)
- Client读取数据流程?
Hlog:
目的:在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的数据会消失,引入Hlog就是为了避免这种情况。
机制:每个HRegionServer中都会有一个HLOG对象,Hlog是一个 Write Ahead Log的类(有待进一步验证),每次用户(Client)写入数据到MemStore中的同时,也会写一份数据到Hlog,Hlog会定期回滚出新,并且会删除旧的文件(已持久化到StoreFile中的数据)。
当HRegionServer意外终止以后,HMaster会通过Zookeeper感知到,HMaster会先处理遗留下来的Hlog,将不同Region的log数据拆分,分配到相应Region目录下,然后在将失效的Region重新分配,领取到这些Region的HRegionServer在Load Region 的过程中,会发现有历史的HLOG需要处理,因此会根据HLOG中的数据重新导入到MemStore中,然后flush到Storefile中,完成数据恢复。
HBase存储格式:(待进一步验证)
HBase所有的数据文件都是存储到HDFS文件系统上,格式主要有两种:
- HFile (传统Hadoop的Key Value格式,二进制格式文件)
- HLog HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File。
HFile:
- HFile文件不定长,长度固定的块只有两个:Trailer和FileInfo
- Trailer中指针指向其他数据块的起始点
- File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等
- Data Index和Meta Index块记录了每个Data块和Meta块的起始点
- Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制
- 每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询
- 每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏
HFile里面的每个KeyValue对就是一个简单的byte数组。这个byte数组里面包含了很多项,并且有固定的结构
- KeyLength和ValueLength:两个固定的长度,分别代表Key和Value的长度
- Key部分:Row Length是固定长度的数值,表示RowKey的长度,Row 就是RowKey
- Column Family Length是固定长度的数值,表示Family的长度
- 接着就是Column Family,再接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)
- Value部分没有这么复杂的结构,就是纯粹的二进制数据
Hlog File:
HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。
HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue。
原文出处:http://www.cnblogs.com/shitouer/archive/2012/06/04/2533518.html