从hdfs传出文件

w6lpcovy  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(402)

我想将文件从hdfs传输到不同服务器的本地文件系统,该服务器不在hadoop集群中,而是在网络中。
我本可以做到:

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

由于数据量巨大,而且hadoop网关机器的本地文件系统空间有限,我想避免这种情况,直接将数据发送到我的文件服务器。
请提供一些关于如何处理这个问题的建议。

jgovgodb

jgovgodb1#

您可以使用webhdfsrestapi来实现这一点。做一个 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

但是,imho,最方便的方法是使用namenodewebui。因为这台机器是网络的一部分,所以您可以将您的web浏览器指向 NameNode_Machine:50070 . 在浏览完hdfs之后,打开要下载的文件并单击 Download this file .

kxeu7u2r

kxeu7u2r2#

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

vdzxcuhz

vdzxcuhz3#

这是最简单的方法:

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

它也适用于二进制文件。

w1e3prcc

w1e3prcc4#

我也在尝试这样做(我使用kerberos安全性)。这在小更新之后对我很有帮助:https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#open
直接运行 curl -L -i --negotiate "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN" 我会解释原因的。
此命令将执行两个步骤:
找到你想要下载的文件并创建一个临时链接-return 307 Temporary Redirect 他将从这个链接下载一个数据返回 HTTP 200 OK .
切换器 -L 他说他拿了一把锉刀直接继续锯。如果添加到curl命令 -v ,它将记录到输出;如果是这样,您将看到命令行中描述的两个步骤,如我所说。但是-因为旧版本的curl(我无法理解)无法工作。
解决方案(在shell中):

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。

oxiaedzo

oxiaedzo5#

因此,您可能有一个包含许多部分的文件作为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的密码修饰符

相关问题