1.Hbase的读取过程。
以读取test_region表,row key为this is row value 400000为例.
1: 到zookeeper中去读取/hbase/root-region-server znode中的值,得到-ROOT-的唯一region归那台region-server管.
2: 管-ROOT- 的那台region-server将从hdfs系统中加载-ROOT-表的内容到内存中(并cache).
3.1 在我目前的测试中-ROOT- 表只有一个row key, 所以直接从info:server中得到管.META.的那台region-server管, 返回给clinet.
3.2 如果-ROOT-表中有多条.META.关于test_region表的记录,找法和4相同
4: 管.META. 的那台region-server从hdfs加载表.META.的数据,并cache. client以test_region,this is row value 400000, 9999999999999, 找到那条比这个key最接近的那条数据,从info:server中得管这个表的这个region(叫a)的region-server服务器.
5: 管理a这个region的服务器从hdfs找到存储这条数据的文件,然后读取返回.
总结:
(1): 经过三次,定位到数据所在的region
(2): 读操作不要经过hmaster
2.Hbase写数据过程。
以插入test_region表,row key为this is row value 400001为例.
1: 到zookeeper中去读取/hbase/root-region-server znode中的值,得到-ROOT-的唯一region归那台region-server管.
2: 管-ROOT- 的那台region-server将从hdfs系统中加载-ROOT-表的内容到内存中(并cache).
3.1 在我目前的测试中-ROOT- 表只有一个row key, 所以直接从info:server中得到管.META.的那台region-server管, 返回给clinet.
3.2 如果-ROOT-表中有多条.META.关于test_region表的记录,找法和4相同
4: 管.META. 的那台region-server从hdfs加载表.META.的数据,并cache. client以test_region,this is row value 400000, 9999999999999, 找到那条比这个key最接近小的那条数据,从info:server中得管这个表的这个region(叫a)的region-server服务器.
5: 先写HLog, 当region-server死了后恢复数据使用
6.1 : 如果cache 没有达到指定的值,则把数据写到这台region-server服务器的这块内存就好了.
6.2 : 如果cache已达到某个值,则新建一个内存区去接受新来的insert,老的cache区将由一个线程flush到文件系统相应用的region.
7: 如果region文件太多并达到某些大小,将开启一个线程做合并工作,合并后将删除其它小文件,如果合并后文件过大,将进行split,split多个region时,将向master报告region要进行重新分配。进入master分配region过程.
总结:
(1): 经过三次,定位到数据所在的region
(2): 写操作不要经过hmaster.
(3): 写操作将会触发一系统动作