讀數(shù)據(jù)
HBase的表是按行拆分為一個個 region 塊兒,這些塊兒被放置在各個 regionserver 中
假設(shè)現(xiàn)在想在用戶表中獲取 row key 為 row0001 的用戶信息
要想取得這條數(shù)據(jù),就需要先找到含有此條記錄的 region
HBase 是如何定位到具體 regionserver 中的具體 region 的呢?

HBase 中有一個內(nèi)置的 hbase:meta 表,其中記錄了所有表的所有 region 的詳細信息
例如 region 的 開始KEY 、 結(jié)束KEY 、 所在server的地址 ……

hbase:meta 表就像一個目錄,通過他可以快速定位數(shù)據(jù)的實際位置
hbase:meta 表是存儲在 ZooKeeper 中的,所以客戶端就需要先訪問 ZooKeeper,獲取到 hbase:meta ,從中查詢出目標(biāo)數(shù)據(jù)是在哪個 regionserver 中的哪個 region 中,然后到 region 中進行讀取

我們可能會感覺這個尋址路徑有點長,所以客戶端會將查詢過的位置信息保存緩存起來,方便以后快速讀取
寫數(shù)據(jù)
寫操作會被分配到對應(yīng)的 regionserver 進行處理,先回顧一下 regionserver 的結(jié)構(gòu)

從客戶端來看,寫操作比較簡單,寫請求到達 regionserver 后,這些修改會先被寫到 MemStore 和 HLog 中,成功寫入后便會通知客戶端寫入完成了
MemStore是內(nèi)存緩存,保存最近更新的數(shù)據(jù)
HLog是日志文件,記錄著所有的更新操作
對于系統(tǒng)來說,寫操作還沒完,系統(tǒng)會定期調(diào)用刷新緩存的方法,把MemStore中的內(nèi)容寫入文件,生成一個新的 StoreFile ,然后把緩存清空,并在HLog中做一個標(biāo)記,表明上面的內(nèi)容已經(jīng)寫入文件
這樣,數(shù)據(jù)就真正落地了,但寫操作會引發(fā)一些后續(xù)問題,例如HLog日志文件越來越大了、StoreFile越來越多了、當(dāng)前region越來越大了,所以,系統(tǒng)有還有更多的工作需要做
系統(tǒng)會定期清理HLog日志文件,把其中已經(jīng)寫入文件的記錄刪除
當(dāng) StoreFile 文件數(shù)量超過設(shè)定值時,會觸發(fā)合并操作,合并成一個大文件,如果這個大文件超過了設(shè)定值,會再被分割開
當(dāng)region的大小達到閾值時,會被切分開,生成一個新的region,HMaster會對其進行管理,分配到合適的 regionserver
region的變化后,系統(tǒng)還需要對 hbase:meta 表進行維護