我想将文件从hdfs传输到不同服务器的本地文件系统,该服务器不在hadoop集群中,而是在网络中。我本可以做到:
hadoop fs -copyToLocal <src> <dest> and then scp/ftp <toMyFileServer>.
由于数据量巨大,而且hadoop网关机器的本地文件系统空间有限,我想避免这种情况,直接将数据发送到我的文件服务器。请提供一些关于如何处理这个问题的建议。
jgovgodb1#
您可以使用webhdfsrestapi来实现这一点。做一个 curl 从您要下载文件的机器。
curl
curl -i -L "http://namenode:50075/webhdfs/v1/path_of_the_file?op=OPEN" -o ~/destination
另一种方法是使用 DataNode API 通过 wget 为此:
DataNode API
wget
wget http://$datanode:50075/streamFile/path_of_the_file
但是,imho,最方便的方法是使用namenodewebui。因为这台机器是网络的一部分,所以您可以将您的web浏览器指向 NameNode_Machine:50070 . 在浏览完hdfs之后,打开要下载的文件并单击 Download this file .
NameNode_Machine:50070
Download this file
kxeu7u2r2#
我认为最简单的解决方案是网络挂载或sshfs来模拟本地文件服务器目录。您还可以将ftp装载为本地目录:http://www.linuxnix.com/2011/03/mount-ftp-server-linux.html
vdzxcuhz3#
这是最简单的方法:
ssh <YOUR_HADOOP_GATEWAY> "hdfs dfs -cat <src_in_HDFS> " > <local_dst>
它也适用于二进制文件。
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中):
curl -L -i --negotiate "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN"
307 Temporary Redirect
HTTP 200 OK
-L
-v
LOCATION=`curl -i --negotiate -u : "${FILE_PATH_FOR_DOWNLOAD}?op=OPEN" | /usr/bin/perl -n -e '/^Location: (.*)$/ && print "$1\n"'`
这将获得临时链接并将其保存到 $LOCATION 变量。
$LOCATION
RESULT=`curl -v -L --negotiate -u : "${LOCATION}" -o ${LOCAL_FILE_PATH_FOR_DOWNLOAD}`
如果您添加 -o <file-path> .我希望有帮助。j。
-o <file-path>
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的密码修饰符
5条答案
按热度按时间jgovgodb1#
您可以使用webhdfsrestapi来实现这一点。做一个
curl
从您要下载文件的机器。另一种方法是使用
DataNode API
通过wget
为此:但是,imho,最方便的方法是使用namenodewebui。因为这台机器是网络的一部分,所以您可以将您的web浏览器指向
NameNode_Machine:50070
. 在浏览完hdfs之后,打开要下载的文件并单击Download this file
.kxeu7u2r2#
我认为最简单的解决方案是网络挂载或sshfs来模拟本地文件服务器目录。
您还可以将ftp装载为本地目录:http://www.linuxnix.com/2011/03/mount-ftp-server-linux.html
vdzxcuhz3#
这是最简单的方法:
它也适用于二进制文件。
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
变量。如果您添加
-o <file-path>
.我希望有帮助。
j。
oxiaedzo5#
因此,您可能有一个包含许多部分的文件作为hadoop程序的输出。
那么让我们一次做一部分?
您可能需要查找scp的密码修饰符