hbase寫資料架構圖:
hbase寫過程如下:
先將資料寫到wal中;
wal存放在hdfs上;
每次put、delete操作的資料均追加到wal末端;
持久化到wal之後,再寫到memstore中;
兩者寫完返回ack客戶端。
memstore其實是一種記憶體結構,乙個column family對應乙個memstore,memstore裡邊的資料也是對rowkey進行字典排序的,如下:
既然我們寫資料都是先寫wal,再寫memstore,而memstore是記憶體結構,所以memstore總會寫滿的,將memstore的資料從記憶體刷寫到磁碟的操作稱為flush;
以下幾種行為會導致flush操作:
全域性記憶體控制
memstore使用達到上限
regionserver的hlog數量達到上限;
手動觸發
關閉region server觸發
每次flush操作都是將乙個memstore的資料寫到乙個hfile裡面的,所以上圖中hdfs上有許多個hfile檔案。檔案多了會對h後面的讀操作有影響,所以hbase會隔一段時間將hfile合併。根據合併的範圍不同分為minor compaction和major compaction:
minor compaction:指選取一些小的、相鄰的hfile將他們合併成乙個更大的hfile
major compaction:將乙個column family下所有的hfile合併成更大的;刪除那些標記為刪除的資料、超過ttl(time-to-live)時限的資料,以及超過了版本數量限制的資料。
hbase讀操作相對於寫操作更為複雜,其需要讀取blockcache、memstore以及hfile。
hbase表按照rowkey分布到集群的不同機器上,那麼我們如何去確定我們該讀哪些regionserver呢?這就是hbase region查詢的問題
客戶端按照上面的流程查詢需要讀寫的regionserver。這個過程一般是第一次讀寫的時候進行的,在第一次讀取到元資料之後客戶端一般會把這些資訊快取到自己的記憶體中,後面操作直接從記憶體拿就行。當然,後面元資料資訊可能還會變動,這時候客戶端會再次按照上面的流程獲取元資料。
你的鼓勵是我分享技術最大的動力!如有錯誤之處,請指正,不勝感激。
HBase讀寫資料流程
hbase的系統表 hbase namespace 儲存了hbase中的所有namespace的資訊 hbase meta 儲存了hbase中所有的region的資訊,包括rowkey範圍,region所在的regionserver的位址。hbase meta 在zookeeper中,進入zooke...
HBase讀寫資料流程
客戶端現在要插入一條資料,rowkey r000001,這條資料應該寫入到table表中的那個region中呢?1 客戶端要連線zookeeper,從zk的 hbase 節點找到 hbase meta 表所在的regionserver host port 2 regionserver 掃瞄 hbas...
HBASE 詳細架構 資料讀寫
資料的讀寫流程不依賴於master,但是長期在沒有master的情況下進行資料的讀寫是不健康的。例如,當乙個region過大進行切分之後,沒有master是無法把切分後的資料分配到其他節點上去的。寫流程 請求regionserver找到meta表 通過meta的內容找到目標寫入資料的位置資訊 通過位...