HBase读写流程
读流程:
读流程概览:
1.首先,客户端需要获知其想要读取的信息的Region的位置,这个时候,Client访问hbase上数据时并不需要Hmaster参与(HMaster仅仅维护着table和Region的元数据信息,负载很低),只需要访问zookeeper,从meta表获取相应region信息(地址和端口等)。【Client请求ZK获取.META.所在的RegionServer的地址。】
2.客户端会将该保存着RegionServer的位置信息的元数据表.META.进行缓存。然后在表中确定待检索rowkey所在的RegionServer信息(得到持有对应行键的.META表的服务器名)。【获取访问数据所在的RegionServer地址】
3.根据数据所在RegionServer的访问信息,客户端会向该RegionServer发送真正的数据读取请求。服务器端接收到该请求之后需要进行复杂的处理。
4.先从MemStore找数据,如果没有,再到StoreFile上读(为了读取的效率)。
[1]
[2]
注:
1.客户端只需要配置zookeeper的访问地址以及根目录,就可以进行正常的读写请求。不需要配置集群的RegionServer地址列表。
2.在Hbase 0.96版本以前,Hbase有两个特殊的表,分别是-ROOT-表和.META.表,其中-ROOT-的位置存储在ZooKeeper中,-ROOT-本身存储了 .META. Table的RegionInfo信息,并且-ROOT-不会分裂,只有一个region。而.META.表可以被切分成多个region。0.96版本以后将-ROOT-表去掉了。
详细叙述:
见文章:HBase数据读取流程解析,写得很详细
写流程:
写流程概览:
普通操作是HBase中最核心、效率最高的操作。具体的写入操作分为客户端和服务器端两个部分。
前三点和读类似:
1.Client先访问zookeeper,从.META.表获取相应region信息,然后从meta表获取相应region信息
2.根据namespace、表名和rowkey根据meta表的数据找到写入数据对应的region信息
3.找到对应的regionserver
把数据先写到WAL中,即HLog,然后写到MemStore上
4.MemStore达到设置的阈值后则把数据刷成一个磁盘上的StoreFile文件。
5.当多个StoreFile文件达到一定的大小后(这个可以称之为小合并,合并数据可以进行设置,必须大于等于2,小于10——hbase.hstore.compaction.max和hbase.hstore.compactionThreshold,默认为10和3),会触发Compact合并操作,合并为一个StoreFile,(这里同时进行版本的合并和数据删除。)
6.当Storefile大小超过一定阈值后,会把当前的Region分割为两个(Split)【可称之为大合并,该阈值通过hbase.hregion.max.filesize设置,默认为10G】,并由Hmaster分配到相应的HRegionServer,实现负载均衡
详细叙述:
TODO:待实战需要优化时在深入学习,不然学了也忘——学而不思则罔。
参考:
[1]简书-飞鸿无痕:Hbase技术详细学习笔记
[2]HBase数据读取流程解析
2.HBase企业应用开发实战