Hadoop 从HDFS传输文件
我想将文件从HDFS传输到不同服务器的本地文件系统,该服务器不在hadoop集群中,而是在网络中 我本可以做到:Hadoop 从HDFS传输文件,hadoop,hdfs,data-transfer,Hadoop,Hdfs,Data Transfer,我想将文件从HDFS传输到不同服务器的本地文件系统,该服务器不在hadoop集群中,而是在网络中 我本可以做到: hadoop fs -copyToLocal <src> <dest> and then scp/ftp <toMyFileServer>. hadoop fs-copyToLocal 然后是scp/ftp。 由于数据量巨大,而且hadoop网关机器的本地文件系统空间有限,我希望避免这种情况,并将数据直接发送到我的文件服务器 请提供一些关于如何
hadoop fs -copyToLocal <src> <dest>
and then scp/ftp <toMyFileServer>.
hadoop fs-copyToLocal
然后是scp/ftp。
由于数据量巨大,而且hadoop网关机器的本地文件系统空间有限,我希望避免这种情况,并将数据直接发送到我的文件服务器
请提供一些关于如何处理此问题的建议。我认为最简单的解决方案是使用网络挂载或SSHFS在本地模拟本地文件服务器目录
您还可以将FTP装载为本地目录:
因此,您可能有一个包含大量部件的文件作为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的密码修饰符这是最简单的方法:
ssh <YOUR_HADOOP_GATEWAY> "hdfs dfs -cat <src_in_HDFS> " > <local_dst>
ssh“hdfs-dfs-cat”>
它也适用于二进制文件。您可以使用webHDFS REST API来实现这一点。从要下载文件的机器上执行
curl
curl -i -L "http://namenode:50075/webhdfs/v1/path_of_the_file?op=OPEN" -o ~/destination
另一种方法可以是通过wget
使用DataNode API
来执行此操作:
wget http://$datanode:50075/streamFile/path_of_the_file
但是,最方便的方法,IMHO,将是使用namenodewebui。由于此计算机是网络的一部分,您可以将web浏览器指向
NameNode\u计算机:50070
。浏览完HDFS后,打开要下载的文件,然后单击下载此文件我也在尝试这样做(我使用的是Kerberos安全性)。这在小更新后对我有所帮助:
直接运行curl-L-i--“http://:/webhdfs/v1/?op=OPEN”对我不起作用,我会解释原因
此命令将执行两个步骤:
307临时重定向
http200ok
-L
说他拿了一个文件,直接继续锯切。如果您添加到curl命令-v
,它将记录到输出;如果是这样,您将看到命令行中描述的两个步骤,正如我所说的。但是-因为旧版本的curl(我无法预测)无法工作
解决方案(在Shell中):
这将获得临时链接并将其保存到$LOCATION
变量
RESULT=`curl -v -L --negotiate -u : "${LOCATION}" -o ${LOCAL_FILE_PATH_FOR_DOWNLOAD}`
如果您添加-o
,这将把它保存到本地文件中
我希望这有帮助
J.您的文件服务器能否直接连接到您的namenode?否。目前,它无法连接。但是我想知道你的建议。我会做一个简单的SSH隧道到你的namenode并从你的文件服务器连接。谢谢David的解决方案!但是,不知何故,这里没有跨环境装载。我现在将使用djc391建议的解决方法。您提到了海量数据,因此我寻找了完全避免在本地存储数据的方法。您所说的跨环境装载是什么意思?是否可以递归地进行?复制文件和目录?
RESULT=`curl -v -L --negotiate -u : "${LOCATION}" -o ${LOCAL_FILE_PATH_FOR_DOWNLOAD}`