當前位置:
首頁 > 知識 > 如何使用Hadoop捆綁的低級工具進行數據提取?

如何使用Hadoop捆綁的低級工具進行數據提取?

在之前的幾個章節,我們已經掌握了如何將數據從其他系統導入Hadoop。一旦企業使用Hadoop執行某些關鍵功能,無論是數據挖掘還是數據聚合,下一步通常是將該數據外部化到其他系統。例如,通常依靠Hadoop對從實時系統中提取的數據執行離線聚合,然後將派生數據反饋到實時系統中。

本節將介紹一些希望從Hadoop獲取數據的常見方案,以及可幫助完成這項工作的工具。我們首先看一下現有的低級工具,其中大多數工具都內置在Hadoop中,然後繼續研究如何將數據推送到關係資料庫和HBase。

首先,我們將介紹如何使用命令行從Hadoop中複製文件。

5.3.1 Roll your own egress

本節介紹Hadoop中用於從HDFS複製數據的一些內置機制。這些技術可以手動執行,也可以使用Azkaban,Oozie甚至cron等調度系統自動執行。

實踐:使用CLI提取文件

想像一下,你在Hadoop中運行一些工作來聚合數據,現在想要把它拿出來,可以使用的一種方法是HDFS命令行界面(CLI),用於將目錄和文件提取到本地文件系統。此技術涵蓋了一些可以幫助你的基本CLI命令。

問題

希望使用shell將文件從HDFS複製到本地文件系統。

解決方案

HDFS CLI可用於一次性移動,或者相同的命令可以合併到腳本中,以便更頻繁地使用移動。

討論

通過hadoop命令可以將文件從HDFS複製到本地磁碟:

$ hadoop fs -get hdfs-file.txt local-file.txt

Hadoop put命令的行為與Linux中的Linux cp命令不同,如果目標已存在,則被覆蓋; 在Hadoop中,副本失敗並顯示錯誤:

put: `hdfs-file.txt": File exists

必須添加-f選項以強制覆蓋文件:

$ hadoop fs -get -f hdfs-file.txt local-file.txt

與Linux cp命令相似,可以使用相同的命令複製多個文件。在這種情況下,最後一個參數必須是HDFS文件複製到本地文件系統的目錄:

$ hadoop fs -get hdfs-file1.txt hdfs-file2.txt /local/dest/

通常,一個是將大量文件從HDFS複製到本地磁碟——例如,MapReduce作業輸出目錄包含每個任務的文件。如果使用的是可以連接的文件格式,則可以使用-getmerge命令組合多個文件。默認情況下,在連接期間,在每個文件的末尾添加換行符:

$ hdfs fs -getmerge hdfs-dir/part* /local/output.txt

fs命令支持更多操作——查看完整列表,運行命令時沒有任何選項。

使用CLI的挑戰在於它非常低級,並且無法滿足自動化需求。當然,我們可以在shell腳本中使用CLI,但是一旦升級到更複雜的編程語言,為每個HDFS命令分配進程並不理想。在這種情況下,可能希望查看使用REST,Java或C HDFS API。下一個技術著眼於REST API。

實踐:使用REST提取文件

使用CLI對於快速運行命令和編寫腳本非常方便,但是會產生為每個命令分配單獨進程的開銷,這可能是希望避免的,特別是如果在編程中與HDFS連接。該技術涵蓋了使用Java以外的語言處理HDFS。

問題

如何讓沒有HDFS本機介面的編程語言與HDFS進行交互。

解決方案

使用Hadoop的WebHDFS介面,該介面為HDFS操作提供全功能的REST API。

討論

在開始之前,需要在集群上啟用WebHDFS

讓我們首先使用CLI在HDFS中創建一個文件:

$echo "the cat sat on the mat" | hadoop fs -put - /tmp/hdfs-file.txt

從HDFS讀取文件是指定OPEN為operation:

如何使用Hadoop捆綁的低級工具進行數據提取?

實踐:在防火牆下實現HDFS讀取

生產Hadoop環境通常被鎖定以保護駐留在這些集群中的數據。部分安全過程可能包括將集群置於防火牆之後,如果Hadoop集群的目標位於防火牆之外,這可能會造成麻煩。該技術著眼於使用HttpFS網關通過埠80提供HDFS訪問,埠80通常在防火牆上打開。

問題

希望從HDFS中提取數據,但是正處於限制訪問HDFS的防火牆下。

解決方案

使用HttpFS網關,這是一個獨立伺服器,可通過HTTP提供對HDFS的訪問。因為它是一個單獨的服務而且是HTTP,所以可以配置為在任何可訪問Hadoop節點的主機上運行,並且可以打開防火牆規則以允許流量到服務。

討論

HttpFS非常有用,不僅可以使用REST來訪問HDFS,還具有完整的Hadoop文件系統實現,這意味著可以使用CLI和本機HDFS Java客戶端與HDFS進行通信。

一旦運行,可以發出與之前使用WebHDFS技術相同的curl命令(唯一的區別是URL主機和埠,需要指向部署HttpFS的位置)。這是關於HttpFS網關的好處之一—語法完全相同。

要轉儲文件/tmp/hdfs-file.txt的內容,需要執行以下操作:

如何使用Hadoop捆綁的低級工具進行數據提取?

實踐:使用NFS掛載Hadoop

通常,如果Hadoop數據可以作為文件系統的常規安裝來訪問,那麼使用Hadoop數據要容易得多。這允許使用現有腳本,工具和編程語言,並輕鬆地與HDFS中的數據進行交互。本節介紹如何使用NFS輕鬆地從HDFS複製數據。

問題

將HDFS視為常規Linux文件系統,並使用標準Linux工具與HDFS進行交互。

解決方案

使用Hadoop的NFS實現來訪問HDFS中的數據。

討論

前文介紹了用於NFS訪問HDFS的設置指令。設置完成後,可以執行正常的文件系統操作,例如將文件從HDFS複製到本地文件系統。以下示例顯示了這一點,假設HDFS安裝在/hdfs下:

$ cp /hdfs/tmp/foo.txt ~/

實踐:使用DistCp從Hadoop中複製數據

想像一下,希望從Hadoop中移出大量數據。對於本節中的大多數技術,有一個瓶頸,因為通過單個主機彙集數據,該主機是運行該進程的主機。要儘可能優化數據移動,需要利用MapReduce並行複製數據。這是DistCp發揮作用的地方,這種技術是一種可以將數據提取到NFS掛載的方法。

問題

希望有效地從Hadoop中提取數據並並行化副本。

解決方案

使用DistCp。

討論

前文詳細介紹了DistCp,並包含有關如何在不同Hadoop集群之間複製數據的詳細信息,但DistCp不能用於將數據從Hadoop複製到本地文件系統(反之亦然),因為DistCp作為MapReduce作業運行,並且集群將無法訪問本地文件系統。根據具體情況,有幾種選擇:

使用HDFS File Slurper複製本地文件。

將文件複製到NFS,該NFS也可用於集群中的所有DataNode。

如果使用第二個選項,則可以使用DistCp並在每個DataNode上寫入本地安裝的NFS掛載,其示例如下:

如何使用Hadoop捆綁的低級工具進行數據提取?

請注意,NFS系統可能無法處理大量並行讀取或寫入,因此可能希望使用少於默認值20的mapper運行此命令——以下示例使用5個mapper運行:

如何使用Hadoop捆綁的低級工具進行數據提取?

使用Java提取文件

假設已經在HDFS中生成了許多Lucene索引,並且希望將它們拉出到外部主機。也許你想用Java以某種方式操作文件,此技術顯示了如何使用Java HDFS API讀取HDFS中的數據。

問題

希望將HDFS中的文件複製到本地文件系統。

解決方案

使用Hadoop的文件系統API從HDFS複製數據。

討論

HDFS Java API與Java的I/O模型很好地集成,這意味著可以使用常規輸入流和I/O輸出流。

首先,需要使用命令行在HDFS中創建一個文件:

$ echo "hello world" | hadoop fs -put - hdfs-file.txt

現在使用命令行將該文件複製到本地文件系統:

$ hadoop fs -get hdfs-file.txt local-file.txt

讓我們來探索如何在Java中複製此副本。編寫代碼有兩個主要部分—第一部分是獲取FileSystem的句柄並創建文件,第二部分是將數據從標準輸入複製到OutputStream:

如何使用Hadoop捆綁的低級工具進行數據提取?

可以通過運行以下命令來查看此代碼在實踐中的工作原理:

如何使用Hadoop捆綁的低級工具進行數據提取?

到目前為止,我們已經介紹了與Hadoop捆綁在一起的低級工具,以幫助提取數據。接下來,我們將介紹從HDFS到本地文件系統的近乎連續的數據移動方法。

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

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


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

Splunk>live!2018北京開講:合格的大數據處理平台是什麼樣子?
Hadoop數據傳輸:如何將數據移入和移出Hadoop?

TAG:IT168企業級 |