从HDFS传输文件

时间:2012-08-29 08:27:02

标签: hadoop hdfs data-transfer

我想将文件从HDFS传输到不在hadoop群集中但在网络中的不同服务器的本地文件系统。

我本可以做到:

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

由于数据量巨大且由于hadoop网关机器的本地文件系统空间有限,我想避免这种情况并将数据直接发送到我的文件服务器。

请帮助解决有关如何处理此问题的一些建议。

5 个答案:

答案 0 :(得分:11)

这是最简单的方法:

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

它也适用于二进制文件。

答案 1 :(得分:2)

我认为最简单的解决方案是网络安装或SSHFS来本地模拟本地文件服务器目录。
您还可以将FTP作为本地目录挂载: http://www.linuxnix.com/2011/03/mount-ftp-server-linux.html

答案 2 :(得分: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 you@somewhere:/home/you/
rm ./part-r-0000$i
done

您可能需要为scp

查找密码修饰符

答案 3 :(得分:2)

您可以使用webHDFS REST API来实现这一目标。从要下载文件的计算机上执行curl

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

另一种方法可能是使用DataNode APIwget来执行此操作:

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

但是,最方便的方式,恕我直言,将使用NameNOde webUI。由于此计算机是网络的一部分,因此您只需将Web浏览器指向NameNode_Machine:50070即可。之后浏览HDFS,打开要下载的文件,然后单击Download this file

答案 4 :(得分: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

  3. 切换台-L说他拿了一个文件并继续直接锯切。如果添加到curl命令-v,它将记录到输出;如果是这样,你会在命令行中看到描述的两个步骤,正如我所说。但是 - 因为旧版卷曲(我不能用它)它不会起作用。

    解决方案(壳牌):

    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>,这会将其保存到您的本地文件。

    我希望它有所帮助。

    学家