Hbase Bulk Loading與HBase API方式分析和對比

1.概述

往hbase中批量加載數據的方式有很多種,最直接方式是調用hbase的API用put方法插入數據;另外一種是用MapReduce的方式從hdfs上加載數據,調用TableOutputFormat 類在reduce中直接生成put對象寫入HBase(這種方式可以看作多線程的調用hbase API方式);但是這兩種方式效率都不是很高。

Bulk Load 方式調用MapReduce的job直接將數據輸出成hbase table內部的存儲格式的文件HFile,然後將生成的StoreFiles 加載集羣的相應節點。這種方式相對於直接調用hbase API來說可以耗費更少的CPU和網絡IO,而且不佔用region資源,增添負載,在首次數據加載時,能極大的提高寫入效率,並降低對HBase節點的寫入壓力。


2.寫入流程對比
2.1 Hbase API方式數據導入流程

瞭解調用Hbase API方式導入流程之前,我們先來看一張hbase的架構圖。


圖1 Hbase架構圖
  • Region Server 管理一系列的region,每個region又由多個Store組成;
  • 每個Store對應hbase的一個列族(Column Family),每個Store又由MemStore和StoreFile兩部分組成;
  • MemStore是sorted Memory Buffer,MemStore滿之後會flush到StoreFile中,每個StoreFile對應一個實際的HFile文件。
  • HLog記錄每個RegionServer的數據操作日誌,防止RegionServer突然宕機導致MemStore中的數據丟失,如果regionServer突然宕機,HLog將對丟失的數據進行恢復;HLog中的數據會定期滾動更新,刪除已經持久化到StoreFile的舊文件。
下面看調用HBase API往Hbase中插入數據的流程。

圖2 hbase的寫流程
  • -client端寫入操作數據傳到Region Server中,默認首先會寫入到WAL(Write Ahead Log)中,也就是HLog中,然後纔將數據寫入到對應region的memStore中,memStore滿了之後,flush到HFile中。當然,可以在程序端禁掉寫WAL;
  • -當StoreFile數量達到一定的閾值,會觸發compact合併操作,將多個storeFile合併成一個大的StoreFile,單個StoreFile過大超過閾值之後會觸發region的split操作,並將大的StoreFile一分爲二。
圖3 StoreFile Compact和Split過程

綜上,調用Hbase的API方式寫入效率不算高,hbase會頻繁的進行flush、compact、split操作,並且region Server壓力也比較大。

2.2 bulkLoad方式數據導入流程
圖4 bulk loading架構圖
Bulk loading 方式數據導入大致可分爲三部分:
  1. -數據導入到hdfs;
  2. -調用mapreduce生成HFile文件;
  3. -將HFile文件加載到不同的region中。
在這裏需要注意,第一步需要在bulk Loading程序執行之前提前準備好,因爲mapreduce只能讀取HDFS上的數據;如果原始數據在hdfs上佔用100G大小的空間,那麼hdfs上的預留的空間大小要大於200G,因爲數據要首先生成hfile放在臨時目錄下,最終還要加載到hbase裏。

3 適用場景對比說明

bulk  loading方式也有侷限性,它在初次大規模加載的時候效率很高,增量加載的時候效率會大打折扣,hbase中如果已經有很多數據,往region導入新的hfile會觸發大量的compact和split操作。
如果考慮到增量導數據,並且數據是存在hadoop集羣之外的,可以考慮用多線程直接調用Hbase API的方式。
筆者在一次客戶現場的測試中曾經糾結過選擇哪種方式導數據,最後通過對比還是選擇了多線程導hbase API的方式,後來分析當時的場景確實不太適合bulkload的方式。
客戶提供了一些400K左右的小文件,共700000個,300G,平均分成兩份分別放在兩個hadoop集羣之外的服務器上。通過nfs客戶端傳到hdfs上速度不到10M/s,由於bulkload調用mapreduce,每個文件啓動一個map,所以bulkload的速度也特別慢。於是我開始嘗試用多線程調用hbase API的方式導數據,每個測試服務器啓動12個線程循環遍歷數據文件列表往hbase中壓數據,hbase表提前進行了預分區,所以不會在某個region上出現寫數據的熱點;最後測試結果很出人意料,測試服務器的帶寬都壓滿了,每個導數據的客戶端輸出平均爲100M/S(採用千兆環境),整個Hbase的入庫速率爲200M/S,300G數據用時30分鐘。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章