數據導入終章:如何將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 shell查看負載結果。list命令(不帶任何參數)將顯示HBase中的所有表,而帶有單個參數的scan命令將轉儲表的所有內容:
有了這些數據,我們就可以將其導出到HDFS了。HBase附帶了一個轉儲HBase表的org.apache.hadoop.hbase.mapreduce.Export類。以下代碼段顯示了使用Export類的示例。使用此命令,可以導出整個HBase表:
Export類還支持只導出單個列族,還可以壓縮輸出:
Export類以SequenceFile格式寫入HBase輸出,其中HBase行鍵使用org.apache.hadoop.hbase.io .ImmutableBytesWritable存儲在SequenceFile記錄鍵中,HBase值使用org.apache.hadoop.hbase.client.Result存儲在SequenceFile記錄值中.。
如果要在HDFS中處理導出的數據,該怎麼辦?以下列表顯示了如何讀取HBase SequenceFile並提取Avro記錄的示例。
代碼5.3 讀取HBase SequenceFile以提取Avro記錄
可以針對用於導出的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讀取數據。
代碼5.4 使用MapReduce將HBase數據導入HDFS
可以按如下方式運行此MapReduce作業:
$ hip hip.ch5.hbase.ImportMapReduce --output output
快速查看HDFS,告訴MapReduce作業是否按預期工作:
此輸出確認MapReduce作業按預期工作。
總結
TableInputFormat類檢查HBase並為每個HBase表區域創建輸入拆分。如果有10個HBase region,則將執行10個map任務。輸入格式還包括在輸入拆分中託管region的伺服器,這意味著map任務將被安排在與託管數據的HRegionServer相同的節點上執行。這提供了HBase level的位置,也提供了HDFS level的位置。從該區讀取的數據可能來自本地磁碟,因為一段時間後,所有區的數據都將是本地的。這一切都假定HRegionServers與DataNode在同一主機上運行。
我們的最後關注點是持久存儲,包括對關係資料庫和HBase。接下來,我們將改變方向,看看如何利用kafka將數據導入Hadoop。
※看完這篇,學會MySQL數據複製(含配置教程)
※如何在Hive中進行數據壓縮以實現高效存儲?
TAG:IT168企業級 |