我想将文件从 HDFS 传输到不在 hadoop 集群中而是在网络中的不同服务器的本地文件系统。
我本可以这样做:
hadoop fs -copyToLocal <src> <dest>
and then scp/ftp <toMyFileServer>.
由于数据很大,并且由于 hadoop 网关机器的本地文件系统空间有限,我想避免这种情况并将数据直接发送到我的文件服务器。
请提供有关如何处理此问题的一些指示。
我想将文件从 HDFS 传输到不在 hadoop 集群中而是在网络中的不同服务器的本地文件系统。
我本可以这样做:
hadoop fs -copyToLocal <src> <dest>
and then scp/ftp <toMyFileServer>.
由于数据很大,并且由于 hadoop 网关机器的本地文件系统空间有限,我想避免这种情况并将数据直接发送到我的文件服务器。
请提供有关如何处理此问题的一些指示。
这是最简单的方法:
ssh <YOUR_HADOOP_GATEWAY> "hdfs dfs -cat <src_in_HDFS> " > <local_dst>
它也适用于二进制文件。
因此,您可能有一个包含一堆部分的文件作为 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 的密码修饰符
您可以使用 webHDFS REST API 来做到这一点。curl
从要下载文件的机器上执行。
curl -i -L "http://namenode:50075/webhdfs/v1/path_of_the_file?op=OPEN" -o ~/destination
另一种方法可能是使用DataNode API
throughwget
来做到这一点:
wget http://$datanode:50075/streamFile/path_of_the_file
但是,恕我直言,最方便的方法是使用 NameNOde webUI。由于这台机器是网络的一部分,您只需将网络浏览器指向NameNode_Machine:50070
. 之后浏览 HDFS,打开要下载的文件并单击Download this file
。
我认为最简单的解决方案是网络挂载或 SSHFS 在本地模拟本地文件服务器目录。
您还可以将 FTP 挂载为本地目录:
http ://www.linuxnix.com/2011/03/mount-ftp-server-linux.html
我也在尝试这样做(我使用的是 Kerberos 安全性)。这在小更新后帮助了我:https ://hadoop.apache.org/docs/r1.0.4/webhdfs.html#OPEN
直接运行curl -L -i --negotiate "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN"
对我不起作用,我会解释原因。
该命令将执行两个步骤:
找到您要下载的文件并创建一个临时链接 - 返回307 Temporary Redirect
他将从这个链接下载一个数据返回HTTP 200 OK
。
切换器-L
说他拿了一个文件,直接继续锯。如果您添加到 curl 命令-v
,它将记录到输出;如果是这样,正如我所说,您将在命令行中看到描述的两个步骤。但是 - 因为由于旧版本 curl (我无法更新)它不会工作。
解决方案(在外壳中):
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。