Hbase
官方: Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.
HBase是一个分布式,可扩展的Hadoop大数据存储框架
Hbase是基于谷歌公司的一篇论文,bigtable
Hbase也是构建在HDFS上的一个数据库,底层存储依赖于HDFS
关于Hbase的一些注意点
- Hbase创建表的时候并不是指定列,而是指定列簇,而列对应的是数据(不同于mysql)
- Hbase中RegionServer(以下简称RS)类似Hadoop中的Datanode,负责数据的真正读写操作,管理Region表,合并StoreFile
- HMaster类似于Namenode,通过zookeeper存储元数据信息(HMaster和HRegionServer都是java进程)
- HLog对应于Hadoop中的edits,store对应列簇
- HBase中列不能抛开列簇单独存在,一个列名必须加上CF列簇名字
- 当Region(简单理解为一张表)过大被切分时,是将列簇HStore横向切分,所以在切分后,一个列簇可以对应有多个HStore,而反过来一个HStore只对应着一个列簇
- HFile是Hbase在HDFS上存储的一种格式
- 每个列簇会在memFile后冲刷到storeFile,所以会有许多小文件产生,但后期会有合并机制
- 元数据入口指的是客户端会先去找ZK拿到元数据信息
- RS只是HBase表的一个管理者,真正数据存储还是在HDFS上(DN),而HMaster负责HBase元数据的管理,当一个Region失效,HMaster会将其管理的地址信息分配给其余的RS来保证数据的完整性(数据并未丢失,而数据存储地址管理由HMaster负责)
HBase读写流程
-
Hbase版本0.98以后没有-root-表,元数据信息都存在meta表中,而zookeeper中维护着meta表的地址信息;若是老版本则总体后推一步,包含元数据信息的meta表存在于-root-表中,而root表地址信息维护在zookeeper中。(zookeeper中只负责维护表的地址信息,不可能大量的存在表,从而占用zookeeper空间)
-
Hbase读数据流程:
Hbase读流程和HMaster没有关系,HMaster挂掉一样不影响Hbase的读流程,且读较写流程要慢
- Client向ZK集群发送获取元数据所在的RegionServer
- ZK集群返回meta表所在的RegionServer(RS1:hadoop01)
- Client向RS1请求rowkey所在的RS
- RS1返回rowkey所在的RS2:hadoop02
- Client向RS2发起读数据请求
- RS2返回结果(先读最新的数据也即在内存中的数据,若内存中没有则再读磁盘)
- Hbase写数据流程
- 当Client将数据通过HLog写入Mem Store以后则Client的写入已经结束,而后期的关于MemStore的刷写以及合并过程则跟客户端毫无关系,而是Hbase本身的框架进行后期的一系列的操作
- 写入过程只要不涉及region的切分,则不需要元数据更新。而Hmaster挂掉一样可以进行写的操作,但是长时间处于挂掉状态集群就会很危险,导致数据的严重倾斜,不会进行region的切分以及数据的合并
- Client向ZK集群发送请求,获取meta表所在的RS
- ZK集群返回meta表所在的RS1
- Client获取meta表
- RS1返回meta表的数据给Client
- Client发送写入数据请求
- 先编写HLog编辑日志信息(多副本形式保存在HDFS)
- 将数据写入Memstore
- 向Client反馈写入成功信息