Hadoop 框架包含两个核心组件:
HDFS 和 MapReduce 其中
HDFS 是文件存储系统,负责数据存储;
MapReduce 是计算框架,负责数据计算
Hbase 数据库核心组件4个。
客户端Client、协调服务模块ZooKeeper、 主节点HMaster 和 Region节点 HRegionServer.
CLient 是整个Hbase系统的入口。使用者通过客户端操作 HBase。客户端使用 Hbase 的 RPC 机制与 HMaster 和 RegionServer 进行通信。 对于管理类操作, Client 与 HMaster 进行 RPC 通信; 对于读写类操作, Client 与 RegionServer 进行 RPC 交互。 这里客户端可以是多个, 并不限定是原生JAVA接口, 还有 Thrift、Avro、Rest等客户端模式,甚至 MapReduce 也可以算是一种客户端
Zookeeper Quorum(队列)负责管理 HBase 中多 HMaster的选举、服务器之间状态同步等。 具体讲:存储 HBase 元数据信息、实时监控 RegionServer、存储所有 Region 的寻址入口,保证HBase 集群中只有一个 HMaster节点。
HMaster HMaster 主要负责 Table 和 Region 的管理工作:HBase中可以启动多个 HMaster,通过 Zookeeper 的选举机制保证总有一个 Master 正常运行并提供服务, 其他 HMaster 作为备选时刻准备提供服务。
管理用户对 Table 的增、删、改、查、操作。
管理 RegionServer 的负载均衡, 调整 Region 分布。
在 Region 分裂后, 负责新 Region 的分配
在 RegionServer 死机后,负责失效 RegionServer 上的 Region 迁移。
Region 节点 HRegionServer 主要负责响应用户 I/O 请求, 向 HDFS 文件系统中读写数据,是 HBase 中最核心的模块。 HRegionServer 内部管理了一系列 HRegion 对象, 每个HRegion对应了 Table中的一个 Region。 HRegion由多个HStore组成,每个HStore 对应了 Table 中的一个 Column Family 的存储。 可以看出每个 Column Family 其实就是一个集中的存储单元,因为最好将具备共同 I/O 特性的列放在一个 Column Family 中, 这样能保证读写的高效性。 HRegionServer 的组成结构如图
HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。
HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。下图描述了Compaction和Split的过程:
在理解了上述HStore的基本原理后,还必须了解一下HLog的功能,因为上述的HStore在系统正常工作的前提下是没有问题的,但是在分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。