hbase-写操作
hbase連接過程
hbase client在寫入的數據的過程中,是直接和rs進行通信的,整個的數據寫入流程并不涉及到HMaster。那么client是如何找到對應的rs呢?流程如下:
- client從zookeeper中獲取存儲hbase:root表的RegionServer(設為rs1)的地址信息,hbase考慮到hbase:meta表過大,存儲到了不同的region中,需要一個hbase:root的表對hbase:meta表的元數據進行存儲。在0.98版本后,hbase:mata表不在split,只有一個region,也去除掉了hbase:root表,client的訪問過程也不用進行這一步。
- client訪問rs1,從hbase:root表中獲取對應hbase:meta表的RegionServer(rs2)的地址信息。這里有些問題?hbase:root中如何知道一條數據應該寫入哪個RegionServer?而這個對應的RegionServer應該存儲在哪個hbase:meta中?在下面介紹hbase:meta表介紹。
- client訪問rs2,從hbase:meta表中獲取對應要訪問的region的RegionServer(rs3)的地址信息。
- client訪問rs3,和rs3進行數據交互。這里是具體的數據插入流程看下面兩個具體的步驟(hbase客戶端流程和hbase服務器端流程)。
meta表和root表格式:
?
meta表結構例子:
?root表結構例子:
?
- 回答一下上面步驟二問題,從上面的root表中可以知道,RowKey里面包含了具體的表信息,這里就可以排除其他表,在regioninfo里面有具體的startKey和endKey信息,這里可以判斷該條數據是否在這個區間。通過這兩個信息就可以查找到對應meta表的rs地址。同理可以在meta表中查到到對應的數據交互的rs。
- 還有一個問題,是否每次put數據都需要進行這3次連接?其實不用的,每次client和hbase進行通信后,將訪問過的meta表信息存儲在本地。數據首先從本地的緩存中獲取meta表數據,直接訪問rs進行數據交互。
?
hbase客戶端流程
hbase服務器端流程
?
數據的寫入流程:
- 數據首先寫入到wal中
- 然后數據寫入到MemStore中
- 當MemStore中的數據大小超過閾值,flush到HFile中
當機器出現宕機情況,因為wal和HFile中的數據存儲在hdfs中,并不會出現數據丟失情況,數據丟失的是在MemStore中尚未flush到HFile的數據,可以從wal將這部分數據從新恢復
?
轉載于:https://www.cnblogs.com/cnblog-ycc/p/9841499.html
總結
- 上一篇: 01_13_JSP编译指令
- 下一篇: spring事务介绍