2012-08-29 45 views
12

我想將文件從HDFS傳輸到不在hadoop羣集但在網絡中的其他服務器的本地文件系統。從HDFS傳輸文件

我可以做:

hadoop fs -copyToLocal <src> <dest> 
and then scp/ftp <toMyFileServer>. 

由於數據是巨大的,由於Hadoop的網關機器的本地文件系統中有限的空間,我想避免這種情況,並直接發送數據到我的文件服務器。

請幫助一些關於如何處理這個問題的指針。

+1

您的文件服務器可以直接連接到您的namenode嗎? –

+0

編號現在,它不連接。但我想知道你的建議。 – dipeshtech

+0

會做一個簡單的SSH隧道到您的namenode並從您的文件服務器連接。 –

回答

2

所以你可能有一堆零件從您的Hadoop程序的輸出文件。

part-r-00000 
part-r-00001 
part-r-00002 
part-r-00003 
part-r-00004 

那麼讓我們一次做一個部分?

for i in `seq 0 4`; 
do 
hadoop fs -copyToLocal output/part-r-0000$i ./ 
scp ./part-r-0000$i [email protected]:/home/you/ 
rm ./part-r-0000$i 
done 

您可能需要查找密碼修改爲SCP

2

我認爲最簡單的解決方案是網絡安裝或SSHFS在本地模擬本地文件服務器目錄。
您還可以安裝FTP作爲本地目錄: http://www.linuxnix.com/2011/03/mount-ftp-server-linux.html

+0

感謝David提供的解決方案!但是,不知何故,跨環境安裝在這裏是不可用的。我將與解決方法一起解決djc391現在提出的問題。 – dipeshtech

+0

您提到了巨大的數據,所以我尋找了完全避免在本地存儲數據的方法。您的意思是跨環境安裝? –

9

這是做最簡單的方法:它適用於二進制文件太

ssh <YOUR_HADOOP_GATEWAY> "hdfs dfs -cat <src_in_HDFS> " > <local_dst> 

+0

是否可以遞歸執行?複製文件和目錄? – coloboxp

1

你可以使用webHDFS REST API來做到這一點。從要下載文件的機器上執行curl

curl -i -L "http://namenode:50075/webhdfs/v1/path_of_the_file?op=OPEN" -o ~/destination 

另一種方法可以是使用DataNode API通過wget做到這一點:

wget http://$datanode:50075/streamFile/path_of_the_file 

但是,最便捷的方式,恕我直言,是使用的NameNode的Web用戶界面。由於此機器是網絡的一部分,因此您可以將您的網絡瀏覽器指向NameNode_Machine:50070。之後瀏覽HDFS,打開您要下載的文件並點擊Download this file

0

我也試圖這樣做(我使用的是Kerberos安全性)。這幫我小小的更新後:https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#OPEN

直接運行curl -L -i --negotiate "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN"沒有爲我工作,我會解釋爲什麼。

此命令會做兩個步驟:

  1. 找到您想要下載,並創建一個臨時鏈接文件 - 從這個鏈接返回307 Temporary Redirect

  2. ,他將下載的數據 - 返回HTTP 200 OK

切換臺-L是說他拿一個文件直接繼續鋸。如果您添加捲曲命令-v,它會記錄到輸出;如果是這樣,你會看到在命令行中描述了兩個步驟,正如我所說的。但 - 因爲由於舊版本捲曲(我不能udpate)它不會工作。

解本(殼牌):

LOCATION=`curl -i --negotiate -u : "${FILE_PATH_FOR_DOWNLOAD}?op=OPEN" | /usr/bin/perl -n -e '/^Location: (.*)$/ && print "$1\n"'` 

這將讓臨時鏈接,並將其保存到$LOCATION變量。

RESULT=`curl -v -L --negotiate -u : "${LOCATION}" -o ${LOCAL_FILE_PATH_FOR_DOWNLOAD}` 

如果您添加-o <file-path>,這會將其保存到您的本地文件。

我希望它有幫助。

J.