2012-08-29 39 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.