當前位置:
首頁 > 知識 > 數據導入終章:如何將HBase的數據導入HDFS?

數據導入終章:如何將HBase的數據導入HDFS?

我們的最終目標是將數據導入Hadoop,在之前的章節中,我們介紹了如何將傳統關係資料庫的數據導入Hadoop,本節涉及到了HBase。HBase是一種實時分散式數據存儲系統,通常位於與Hadoop集群相同的硬體上,或者與Hadoop集群緊密相連,能夠直接在MapReduce中使用HBase數據,或將其導入HDFS,這是選擇HBase作為解決方案的巨大優勢之一。

(註:本文為《Hadoop從入門到精通》大型專題的第五章內容,本專題的其他文章見文末鏈接,專題的上半部也將於不久之後與大家見面,請持續關注本專題!)

實踐:將HBase數據導入HDFS

如果將要在MapReduce中使用的客戶數據與HDFS中的數據結合使用,那該怎麼辦?可以編寫一個MapReduce作業,該作業將HDFS數據集作為輸入,並直接從HBase的map或reduce代碼中提取數據。但在某些情況下,將HBase中的數據直接轉儲到HDFS可能更有用,特別是如果計劃在多個MapReduce作業中使用該數據並且HBase數據不可變或不經常更改。

問題

將HBase數據導入HDFS

解決方案

HBase包含一個Export類,可用於將HBase數據以SequenceFile格式導入HDFS。此技術還介紹了可用於讀取導入的HBase數據代碼。

討論

在開始使用這種技術之前,需要啟動並運行HBase。

為了能夠從HBase導出數據,首先需要將一些數據載入到HBase。載入器創建一個名為stocks_example的HBase表,其中包含一個列族的詳細信息,我們將HBase數據存儲為Avro二進位序列化數據,此部分代碼就不列舉了。

運行載入程序並使用它將樣本數據載入到HBase中:

數據導入終章:如何將HBase的數據導入HDFS?

可以使用HBase shell查看負載結果。list命令(不帶任何參數)將顯示HBase中的所有表,而帶有單個參數的scan命令將轉儲表的所有內容:

數據導入終章:如何將HBase的數據導入HDFS?

有了這些數據,我們就可以將其導出到HDFS了。HBase附帶了一個轉儲HBase表的org.apache.hadoop.hbase.mapreduce.Export類。以下代碼段顯示了使用Export類的示例。使用此命令,可以導出整個HBase表:

數據導入終章:如何將HBase的數據導入HDFS?

Export類還支持只導出單個列族,還可以壓縮輸出:

數據導入終章:如何將HBase的數據導入HDFS?

Export類以SequenceFile格式寫入HBase輸出,其中HBase行鍵使用org.apache.hadoop.hbase.io .ImmutableBytesWritable存儲在SequenceFile記錄鍵中,HBase值使用org.apache.hadoop.hbase.client.Result存儲在SequenceFile記錄值中.。

如果要在HDFS中處理導出的數據,該怎麼辦?以下列表顯示了如何讀取HBase SequenceFile並提取Avro記錄的示例。

數據導入終章:如何將HBase的數據導入HDFS?

代碼5.3 讀取HBase SequenceFile以提取Avro記錄

可以針對用於導出的HDFS目錄運行代碼並查看結果:

數據導入終章:如何將HBase的數據導入HDFS?

HBaseExportedStockReader類能夠讀取和轉儲HBase的Export類使用的SequenceFile內容。

使用內置的HBase Export類可以更輕鬆地將HBase中的數據導出到HDFS中。但是,如果不想將HBase數據寫入HDFS,而是想直接在MapReduce作業中處理它,該怎麼辦?讓我們看看如何使用HBase作為MapReduce作業的數據源。

實踐:使用HBase作為 MapReduce的 數據源

內置的HBase導出器使用SequenceFile輸出HBase數據,除了Java之外的編程語言不支持它,並且不支持模式演變。它僅支持Hadoop文件系統作為數據接收器。如果想要更多地控制HBase數據提取,可能需要其他HBase工具。

問題

希望直接在MapReduce作業中對HBase進行操作,而無需將數據複製到HDFS的中間步驟。

解決方案

HBase有一個TableInputFormat類,可以在MapReduce作業中使用,直接從HBase中提取數據。

討論

HBase提供了一個名為TableInputFormat的InputFormat類,它可以將HBase用作MapReduce中的數據源。以下代碼顯示了一個MapReduce作業,它使用此輸入格式(通過TableMapReduceUtil.initTableMapperJob調用)從HBase讀取數據。

數據導入終章:如何將HBase的數據導入HDFS?


數據導入終章:如何將HBase的數據導入HDFS?

代碼5.4 使用MapReduce將HBase數據導入HDFS

可以按如下方式運行此MapReduce作業:

$ hip hip.ch5.hbase.ImportMapReduce --output output

快速查看HDFS,告訴MapReduce作業是否按預期工作:

數據導入終章:如何將HBase的數據導入HDFS?

此輸出確認MapReduce作業按預期工作。

總結

TableInputFormat類檢查HBase並為每個HBase表區域創建輸入拆分。如果有10個HBase region,則將執行10個map任務。輸入格式還包括在輸入拆分中託管region的伺服器,這意味著map任務將被安排在與託管數據的HRegionServer相同的節點上執行。這提供了HBase level的位置,也提供了HDFS level的位置。從該區讀取的數據可能來自本地磁碟,因為一段時間後,所有區的數據都將是本地的。這一切都假定HRegionServers與DataNode在同一主機上運行。

我們的最後關注點是持久存儲,包括對關係資料庫和HBase。接下來,我們將改變方向,看看如何利用kafka將數據導入Hadoop。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT168企業級 的精彩文章:

看完這篇,學會MySQL數據複製(含配置教程)
如何在Hive中進行數據壓縮以實現高效存儲?

TAG:IT168企業級 |