1. 程式人生 > 其它 >HBase 讀寫資料流程

HBase 讀寫資料流程

HBase 讀寫資料流程

HBase 讀資料流程

  • 客戶端建立 Connection 連線物件,通過載入的 hbase-site.xml 配置檔案獲得 zk 叢集地址
  • 客戶端連線到 zk 叢集然後去讀取 zk 目錄 /hbase/meta-region-server 的配置資訊,找到 meta 表存放的 HRegionServer 地址
  • 客戶端根據 zk 返回的 HRegionServer 地址去連線該 HRegionServer 並讀取裡面的 meta 表(meta 表存放著 HBase 中所有 Region 的 startkey 和 endkey,以及 這些 Region 所在的各個 HRegionServer 地址)
  • 客戶端查詢 meta 表,找到將要讀取的表資料屬於哪個 Region,以及歸哪個 HRegionServer 負責管理
  • 客戶端連線該 HRegionServer,傳送讀取資料請求
  • HRegionServer 先從讀快取 BlockCache 中查詢資料,沒有找到再到寫快取 MemStore 中查詢,如果還沒找到就到 HFile 檔案中查詢,獲取資料一方面返回給客戶端,一方面將資料新增到 BlockCache 中,如果下次查詢相同資料則直接從 BlockCache 中返回即可

HBase 寫資料流程

  • 客戶端建立 Connection 連線物件,通過載入的 hbase-site.xml 配置檔案獲得 zk 叢集地址
  • 客戶端連線到 zk 叢集然後去讀取 zk 目錄 /hbase/meta-region-server 的配置資訊,找到 meta 表存放的 HRegionServer 地址
  • 客戶端根據 zk 返回的 HRegionServer 地址去連線該 HRegionServer 並讀取裡面的 meta 表(meta 表存放著 HBase 中所有 Region 的 startkey 和 endkey,以及 這些 Region 所在的各個 HRegionServer 地址)
  • 客戶端查詢 meta 表,找到將要寫入的表資料屬於哪個 Region,以及歸哪個 HRegionServer 負責管理
  • 客戶端連線該 HRegionServer
  • 客戶端獲取行鎖(HBase 中使用行鎖保證對同一行資料的更新都是互斥操作,用以保證更新的原子性)
  • HRegionServer 先將寫入資料操作順序寫入到 WALs 日誌檔案中(類似於 Redis 的 AOF 檔案),然後再寫入 MemStore 寫快取中,這時 HRegionServer 向客戶端返回寫入資料成功
  • 客戶端釋放行鎖(HBase 中其他可以允許 Table 表中該行資料的寫入操作)
  • 當 MemStore 寫快取滿足一定大小之後再一起寫入磁碟中(落盤),並生成新的 HFile 格式檔案

總結

  • 在 HBase 的讀寫過程中,客戶端實際上是不需要跟 HMaster 有任何互動的。這也是為什麼我們在客戶端的配置中,連線地址是填寫的zookeeper 而不是 HMaster
  • 客戶端第一次訪問才會到 zk 中獲取 meta 表資訊,然後會客戶端上進行快取,這樣就不需要每次都到 zk 上去查詢
  • 客戶端上的讀請求分為 兩種:Get 和 Scan,對於 HBase 服務端來說,當一個 Get 請求過來後,還是會轉換為一個特殊的 Scan 請求,即 startrow 和 endrow 一致的 Scan 請求
  • HBase 的寫入很快,是追加多版本的形式,刪除也很快,只是插入一條打上 “deteled” 標籤的資料。因此,HBase 的讀操作比較複雜的,需要處理各種狀態和關係