【大數(shù)據(jù)學(xué)習(xí)】如何使用Hadoop捆綁的低級工具進行數(shù)據(jù)提?。?/h2>

在之前的幾個章節(jié),我們已經(jīng)掌握了如何將數(shù)據(jù)從其他系統(tǒng)導(dǎo)入Hadoop。一旦企業(yè)使用Hadoop執(zhí)行某些關(guān)鍵功能,無論是數(shù)據(jù)挖掘還是數(shù)據(jù)聚合,下一步通常是將該數(shù)據(jù)外部化到其他系統(tǒng)。例如,通常依靠Hadoop對從實時系統(tǒng)中提取的數(shù)據(jù)執(zhí)行離線聚合,然后將派生數(shù)據(jù)反饋到實時系統(tǒng)中。

本節(jié)將介紹一些希望從Hadoop獲取數(shù)據(jù)的常見方案,以及可幫助完成這項工作的工具。我們首先看一下現(xiàn)有的低級工具,其中大多數(shù)工具都內(nèi)置在Hadoop中,然后繼續(xù)研究如何將數(shù)據(jù)推送到關(guān)系數(shù)據(jù)庫和HBase。

首先,我們將介紹如何使用命令行從Hadoop中復(fù)制文件。

在這里我還是要推薦下我自己建的大數(shù)據(jù)學(xué)習(xí)交流qq裙:458345782,?裙?里都是學(xué)大數(shù)據(jù)開發(fā)的,如果你正在學(xué)習(xí)大數(shù)據(jù)?,小編歡迎你加入,大家都是軟件開發(fā)黨,不定期分享干貨(只有大數(shù)據(jù)開發(fā)相關(guān)的),包括我自己整理的一份最新的大數(shù)據(jù)進階資料和高級開發(fā)教程,歡迎進階中和進想深入大數(shù)據(jù)的小伙伴。

5.3.1 Roll your own egress

本節(jié)介紹Hadoop中用于從HDFS復(fù)制數(shù)據(jù)的一些內(nèi)置機制。這些技術(shù)可以手動執(zhí)行,也可以使用Azkaban,Oozie甚至cron等調(diào)度系統(tǒng)自動執(zhí)行。

實踐:使用CLI提取文件

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

問題

希望使用shell將文件從HDFS復(fù)制到本地文件系統(tǒng)。

解決方案

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

討論

通過hadoop命令可以將文件從HDFS復(fù)制到本地磁盤:

$ 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命令相似,可以使用相同的命令復(fù)制多個文件。在這種情況下,最后一個參數(shù)必須是HDFS文件復(fù)制到本地文件系統(tǒng)的目錄:

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

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

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

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

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

實踐:使用REST提取文件

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

問題

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

解決方案

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

討論

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

讓我們首先使用CLI在HDFS中創(chuàng)建一個文件:

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

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


實踐:在防火墻下實現(xiàn)HDFS讀取

生產(chǎn)Hadoop環(huán)境通常被鎖定以保護駐留在這些集群中的數(shù)據(jù)。部分安全過程可能包括將集群置于防火墻之后,如果Hadoop集群的目標位于防火墻之外,這可能會造成麻煩。該技術(shù)著眼于使用HttpFS網(wǎng)關(guān)通過端口80提供HDFS訪問,端口80通常在防火墻上打開。

問題

希望從HDFS中提取數(shù)據(jù),但是正處于限制訪問HDFS的防火墻下。

解決方案

使用HttpFS網(wǎng)關(guān),這是一個獨立服務(wù)器,可通過HTTP提供對HDFS的訪問。因為它是一個單獨的服務(wù)而且是HTTP,所以可以配置為在任何可訪問Hadoop節(jié)點的主機上運行,并且可以打開防火墻規(guī)則以允許流量到服務(wù)。

討論

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

一旦運行,可以發(fā)出與之前使用WebHDFS技術(shù)相同的curl命令(唯一的區(qū)別是URL主機和端口,需要指向部署HttpFS的位置)。這是關(guān)于HttpFS網(wǎng)關(guān)的好處之一—語法完全相同。

要轉(zhuǎn)儲文件/tmp/hdfs-file.txt的內(nèi)容,需要執(zhí)行以下操作:


實踐:使用NFS掛載Hadoop

通常,如果Hadoop數(shù)據(jù)可以作為文件系統(tǒng)的常規(guī)安裝來訪問,那么使用Hadoop數(shù)據(jù)要容易得多。這允許使用現(xiàn)有腳本,工具和編程語言,并輕松地與HDFS中的數(shù)據(jù)進行交互。本節(jié)介紹如何使用NFS輕松地從HDFS復(fù)制數(shù)據(jù)。

問題

將HDFS視為常規(guī)Linux文件系統(tǒng),并使用標準Linux工具與HDFS進行交互。

解決方案

使用Hadoop的NFS實現(xiàn)來訪問HDFS中的數(shù)據(jù)。

討論

前文介紹了用于NFS訪問HDFS的設(shè)置指令。設(shè)置完成后,可以執(zhí)行正常的文件系統(tǒng)操作,例如將文件從HDFS復(fù)制到本地文件系統(tǒng)。以下示例顯示了這一點,假設(shè)HDFS安裝在/hdfs下:

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

實踐:使用DistCp從Hadoop中復(fù)制數(shù)據(jù)

想象一下,希望從Hadoop中移出大量數(shù)據(jù)。對于本節(jié)中的大多數(shù)技術(shù),有一個瓶頸,因為通過單個主機匯集數(shù)據(jù),該主機是運行該進程的主機。要盡可能優(yōu)化數(shù)據(jù)移動,需要利用MapReduce并行復(fù)制數(shù)據(jù)。這是DistCp發(fā)揮作用的地方,這種技術(shù)是一種可以將數(shù)據(jù)提取到NFS掛載的方法。

問題

希望有效地從Hadoop中提取數(shù)據(jù)并并行化副本。

解決方案

使用DistCp。

討論

前文詳細介紹了DistCp,并包含有關(guān)如何在不同Hadoop集群之間復(fù)制數(shù)據(jù)的詳細信息,但DistCp不能用于將數(shù)據(jù)從Hadoop復(fù)制到本地文件系統(tǒng)(反之亦然),因為DistCp作為MapReduce作業(yè)運行,并且集群將無法訪問本地文件系統(tǒng)。根據(jù)具體情況,有幾種選擇:

使用HDFS File Slurper復(fù)制本地文件。

將文件復(fù)制到NFS,該NFS也可用于集群中的所有DataNode。

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


請注意,NFS系統(tǒng)可能無法處理大量并行讀取或?qū)懭?,因此可能希望使用少于默認值20的mapper運行此命令——以下示例使用5個mapper運行:


使用Java提取文件

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

問題

希望將HDFS中的文件復(fù)制到本地文件系統(tǒng)。

解決方案

使用Hadoop的文件系統(tǒng)API從HDFS復(fù)制數(shù)據(jù)。

討論

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

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

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

現(xiàn)在使用命令行將該文件復(fù)制到本地文件系統(tǒng):

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

讓我們來探索如何在Java中復(fù)制此副本。編寫代碼有兩個主要部分—第一部分是獲取FileSystem的句柄并創(chuàng)建文件,第二部分是將數(shù)據(jù)從標準輸入復(fù)制到OutputStream:

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


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

在這里我還是要推薦下我自己建的大數(shù)據(jù)學(xué)習(xí)交流qq裙:458345782,?裙?里都是學(xué)大數(shù)據(jù)開發(fā)的,如果你正在學(xué)習(xí)大數(shù)據(jù)?,小編歡迎你加入,大家都是軟件開發(fā)黨,不定期分享干貨(只有大數(shù)據(jù)開發(fā)相關(guān)的),包括我自己整理的一份最新的大數(shù)據(jù)進階資料和高級開發(fā)教程,歡迎進階中和進想深入大數(shù)據(jù)的小伙伴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容