一、Hbase系统架构原理
:-:
(1)Hbase集群需要依赖Zookeeper集群的分布式协调服务
- Client访问Hbase时,需要先访问Zookeeper,然后访问RegionServer。这是因为Zookeeper维护了与Hbase相关的-ROOT-表和.META表,Client访问用户数据之前需要先访问Zookeeper获取-ROOT-表的位置,然后访问-ROOT-表,然后访问.META表,获取想要的操作的Region的位置信息。
- 从上面的架构图来看,只有一个HMaster,这在实际生产环境中是不被允许的。HMaster必须要有多个才能保证集群的高可用,有多个HMaster的情况下同一时间只有一个管事的HMaster,它是主,其他HMaster都是备。
- 以向Hbase插入数据为例,当Client通过put语句提交Hbase SQL时,RegionServer接收这些提交信息,并记录日志信息,然后找到SQL操作的对应数据的位置即Region,Region将数据存储在内存(MemStore)和本地文件(StoreFile)中。内存中的数据会定期Flush到本地文件中,当本地文件中的数据超过阈值后,这些多出来的数据就会被写入到HDFS中。这个阈值可以在Hbase的配置文件中设置。
(2)Hbase底层依赖Hadoop集群
- 从架构图可以看出,Hbase的底层数据存储在HDFS中,Hbase通过DFS Client将StoreFile文件写入HDFS,并依赖HDFS的分布式存储结构将文件保存多个副本。
- RegionServer会记录有关数据库操作的日志信息,从架构图看出日志文件是保存在RegionServer中的,并会定期存储到HDFS中。
- Hbase底层之所以需要依赖HDFS进行存储,是因为其在数据预处理、数据清洗执行MapReduce时需要将这些数据存储于HDFS之上,而基于HDFS的数据库存储结构解决了上述问题,又用到了类SQL的语言来操作数据。HDFS的多副本功能是一般数据库不具备的亮点。
(3)Hbase核心进程详解
HMaster
- 是Master Server的实现,负责监控集群中的RegionServer实例,同时是所有metadata改变的接口,在集群中,通常运行在NameNode上面
- HMasterInterface暴露的接口:
- Table(createTable, modifyTable, removeTable, enable, disable)
- ColumnFamily (addColumn, modifyColumn, removeColumn)
- Region (move, assign, unassign)
- Master运行的后台线程:
- LoadBalancer线程,控制region来平衡集群的负载
- CatalogJanitor线程,周期性的检查hbase:meta表
HRegionServer
- 是RegionServer的实现,服务和管理Regions,集群中RegionServer运行在DataNode
- HRegionRegionInterface暴露接口:
- Data (get, put, delete, next, etc.)
- Region (splitRegion, compactRegion, etc.)
- RegionServer后台线程:
- CompactSplitThread
- MajorCompactionChecker
- MemStoreFlusher
- LogRoller
Regions
- 代表table,Region有多个Store(列簇),Store有一个Memstore和多个StoreFiles(HFiles),StoreFiles的底层是Block
二、Hbase存储设计
在Hbase中,表被分割成多个更小的块然后分散的存储在不同的服务器上,这些小块叫做Regions,存放Regions的地方叫做RegionServer。Master进程负责处理不同的RegionServer之间的Region的分发。在Hbase实现中HRegionServer和HRegion类代表RegionServer和Region。HRegionServer除了包含一些HRegions之外,还处理两种类型的文件用于数据存储
- HLog, 预写日志文件,也叫做WAL(write-ahead log)
- HFile 真实的数据存储文件
HLog
- MasterProcWAL:HMaster记录管理操作,比如解决冲突的服务器,表创建和其它DDLs等操作到它的WAL文件中,这个WALs存储在MasterProcWALs目录下,它不像RegionServer的WALs,HMaster的WAL也支持弹性操作,就是如果Master服务器挂了,其它的Master接管的时候继续操作这个文件。
- WAL记录所有的Hbase数据改变,如果一个RegionServer在MemStore进行FLush的时候挂掉了,WAL可以保证数据的改变被应用到。如果写WAL失败了,那么修改数据的完整操作就是失败的。
- 通常情况,每个RegionServer只有一个WAL实例。在2.0之前,WAL的实现叫做HLog
- WAL位于/hbase/WALs/目录下
HFile
- HFile是Hbase在HDFS中存储数据的格式,它包含多层的索引,这样在Hbase检索数据的时候就不用完全的加载整个文件。索引的大小(keys的大小,数据量的大小)影响block的大小,在大数据集的情况下,block的大小设置为每个RegionServer 1GB也是常见的。
- Hfile生成方式:起初,HFile中并没有任何Block,数据还存在于MemStore中。Flush发生时,创建HFile Writer,第一个空的Data Block出现,初始化后的Data Block中为Header部分预留了空间,Header部分用来存放一个Data Block的元数据信息。
- 而后,位于MemStore中的KeyValues被一个个append到位于内存中的第一个Data Block中
三、Hbase读写简要流程
:-: