我想将文件从HDFS传输到不在hadoop群集中但在网络中的不同服务器的本地文件系统。
我本可以做到:
hadoop fs -copyToLocal <src> <dest>
and then scp/ftp <toMyFileServer>.
由于数据量巨大且由于hadoop网关机器的本地文件系统空间有限,我想避免这种情况并将数据直接发送到我的文件服务器。
请帮助解决有关如何处理此问题的一些建议。
答案 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 API
到wget
来执行此操作:
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"
没有为我工作,我将解释原因。
此命令将执行两个步骤:
找到您要下载的文件并创建临时链接 - 返回307 Temporary Redirect
从此链接下载数据 - 返回HTTP 200 OK
。
切换台-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>
,这会将其保存到您的本地文件。
我希望它有所帮助。
学家