Hadoop 从HDFS传输文件

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网关机器的本地文件系统空间有限,我希望避免这种情况,并将数据直接发送到我的文件服务器 请提供一些关于如何

我想将文件从HDFS传输到不同服务器的本地文件系统,该服务器不在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}`