本文將針對這個問題介紹如何通過Hbase的BulkLoad方法來快速將海量數(shù)據(jù)導(dǎo)入到Hbase中。
在第一次建立Hbase表的時候,我們可能需要往里面一次性導(dǎo)入大量的初始化數(shù)據(jù)。我們很自然地想到將數(shù)據(jù)一條條插入到Hbase中,或者通過MR方式等。但是這些方式不是慢就是在導(dǎo)入的過程的占用Region資源導(dǎo)致效率低下,所以很不適合一次性導(dǎo)入大量數(shù)據(jù)。本文將針對這個問題介紹如何通過Hbase的BulkLoad方法來快速將海量數(shù)據(jù)導(dǎo)入到Hbase中。
總的來說,使用 Bulk Load 方式由于利用了 HBase 的數(shù)據(jù)信息是按照特定格式存儲在 HDFS 里的這一特性,直接在 HDFS 中生成持久化的 HFile 數(shù)據(jù)格式文件,然后完成巨量數(shù)據(jù)快速入庫的操作,配合 MapReduce 完成這樣的操作,不占用 Region 資源,不會產(chǎn)生巨量的寫入 I/O,所以需要較少的 CPU 和網(wǎng)絡(luò)資源。Bulk Load 的實現(xiàn)原理是通過一個 MapReduce Job 來實現(xiàn)的,通過 Job 直接生成一個 HBase 的內(nèi)部 HFile 格式文件,用來形成一個特殊的 HBase 數(shù)據(jù)表,然后直接將數(shù)據(jù)文件加載到運行的集群中。與使用HBase API相比,使用Bulkload導(dǎo)入數(shù)據(jù)占用更少的CPU和網(wǎng)絡(luò)資源。
實現(xiàn)原理
Bulkload過程主要包括三部分:
1、從數(shù)據(jù)源(通常是文本文件或其他的數(shù)據(jù)庫)提取數(shù)據(jù)并上傳到HDFS。抽取數(shù)據(jù)到HDFS和Hbase并沒有關(guān)系,所以大家可以選用自己擅長的方式進行,本文就不介紹了。
2、利用MapReduce作業(yè)處理實現(xiàn)準(zhǔn)備的數(shù)據(jù) 。這一步需要一個MapReduce作業(yè),并且大多數(shù)情況下還需要我們自己編寫Map函數(shù),而Reduce函數(shù)不需要我們考慮,由HBase提供。該作業(yè)需要使用rowkey(行鍵)作為輸出Key;KeyValue、Put或者Delete作為輸出Value。MapReduce作業(yè)需要使用HFileOutputFormat2來生成HBase數(shù)據(jù)文件。為了有效的導(dǎo)入數(shù)據(jù),需要配置HFileOutputFormat2使得每一個輸出文件都在一個合適的區(qū)域中。為了達到這個目的,MapReduce作業(yè)會使用Hadoop的TotalOrderPartitioner類根據(jù)表的key值將輸出分割開來。HFileOutputFormat2的方法configureIncrementalLoad()會自動的完成上面的工作。
3、告訴RegionServers數(shù)據(jù)的位置并導(dǎo)入數(shù)據(jù)。這一步是最簡單的,通常需要使用LoadIncrementalHFiles(更為人所熟知是completebulkload工具),將文件在HDFS上的位置傳遞給它,它就會利用RegionServer將數(shù)據(jù)導(dǎo)入到相應(yīng)的區(qū)域。歡迎加入大數(shù)據(jù)學(xué)習(xí)交流分享群: 658558542? ?一起吹水交流學(xué)習(xí)(?點擊即可加入群聊)
整個過程圖如下:

代碼實現(xiàn)
上面我們已經(jīng)介紹了Hbase的BulkLoad方法的原理,我們需要寫個Mapper和驅(qū)動程序,實現(xiàn)如下:
使用MapReduce生成HFile文件
驅(qū)動程序

通過BlukLoad方式加載HFile文件


由于Hbase的BulkLoad方式是繞過了Write to WAL,Write to MemStore及Flush to disk的過程,所以并不能通過WAL來進行一些復(fù)制數(shù)據(jù)的操作。后面我將會再介紹如何通過Spark來使用Hbase的BulkLoad方式來初始化數(shù)據(jù)。
BulkLoad的使用案例
1、首次將原始數(shù)據(jù)集載入 HBase- 您的初始數(shù)據(jù)集可能很大,繞過 HBase 寫入路徑可以顯著加速此進程。
2、遞增負載 - 要定期加載新數(shù)據(jù),請使用 BulkLoad 并按照自己的理想時間間隔分批次導(dǎo)入數(shù)據(jù)。這可以緩解延遲問題,并且有助于您實現(xiàn)服務(wù)級別協(xié)議 (SLA)。但是,壓縮觸發(fā)器就是 RegionServer 上的 HFile 數(shù)目。因此,頻繁導(dǎo)入大量 HFile 可能會導(dǎo)致更頻繁地發(fā)生大型壓縮,從而對性能產(chǎn)生負面影響。您可以通過以下方法緩解此問題:調(diào)整壓縮設(shè)置,確保不觸發(fā)壓縮即可存在的最大 HFile 文件數(shù)很高,并依賴于其他因素,如 Memstore 的大小 觸發(fā)壓縮。
3、數(shù)據(jù)需要源于其他位置 - 如果當(dāng)前系統(tǒng)捕獲了您想在 HBase 中包含的數(shù)據(jù),且因業(yè)務(wù)原因需要保持活動狀態(tài),您可從系統(tǒng)中將數(shù)據(jù)定期批量加載到 HBase 中,以便可以在不影響系統(tǒng)的前提下對其執(zhí)行操作。
結(jié)語
感謝您的觀看,如有不足之處,歡迎批評指正。
如果有對大數(shù)據(jù)感興趣的小伙伴或者是從事大數(shù)據(jù)的老司機可以加群:
658558542? ? (?點擊即可加入群聊)
里面整理了一大份學(xué)習(xí)資料,全都是些干貨,包括大數(shù)據(jù)技術(shù)入門,海量數(shù)據(jù)高級分析語言,海量數(shù)據(jù)存儲分布式存儲,以及海量數(shù)據(jù)分析分布式計算等部分,送給每一位大數(shù)據(jù)小伙伴,這里不止是小白聚集地,還有大牛在線解答!歡迎初學(xué)和進階中的小伙伴一起進群學(xué)習(xí)交流,共同進步!
最后祝福所有遇到瓶頸的大數(shù)據(jù)程序員們突破自己,祝福大家在往后的工作與面試中一切順利。