如何将HDFS中的文件复制到本地文件系统

176

如何将文件从HDFS复制到本地文件系统。在文件下没有物理位置,甚至没有目录。我应该如何将它们移动到本地进行进一步验证?我尝试过使用WinSCP。

9个回答

287
  1. bin/hadoop fs -get /hdfs/source/path /localfs/destination/path
  2. bin/hadoop fs -copyToLocal /hdfs/source/path /localfs/destination/path
  3. 在你的网络浏览器中输入HDFS WEBUI(namenode_machine:50070),进入页面后找到想要复制的文件,滚动页面并点击下载该文件

2
再一次,我需要提到Tariq,感谢你贡献时间和知识。非常感谢。你的支持帮了我很多,这给了像我这样的新手很大的信心。 - Surya
1
我明白了。如果您想查看文件的内容或在WebUI上打开文件,实际上可以使用hdfs cat命令。这将使您无需将文件下载到本地文件系统中。不用客气。如果您对问题的答案100%满意,可以将其标记,以便其他人受益。不仅仅是针对这一个问题,而是一般情况下都适用。 - Tariq
2
仅为补充上一条评论,如果是二进制文件,cat 命令将无法显示实际内容。要查看二进制文件的内容,可以使用命令:bin/hadoop fs -text /path/to/file。 - Tariq
1
似乎是一个错误(已修复)。请查看答案。 - Tariq
有没有可能指定你复制的文件的修改/创建日期? - marlieg
显示剩余2条评论

40

在Hadoop 2.0中,

hdfs dfs -copyToLocal <hdfs_input_file_path> <output_path>

其中,

  • hdfs_input_file_path 可能从 http://<<name_node_ip>>:50070/explorer.html 获取。

  • output_path 是文件的本地路径,文件将被复制到该路径下。

  • 您也可以使用get代替copyToLocal


25
为了将文件从HDFS复制到本地文件系统,可以运行以下命令:

hadoop dfs -copyToLocal <input> <output>

  • <input>:要复制的HDFS目录路径(例如/mydata)
  • <output>:目标目录路径(例如~/Documents)
更新:在Hadoop 3中已停用Hadoop。 请使用hdfs dfs -copyToLocal <input> <output>

2
这对我似乎不起作用。它总是显示<input>文件未找到。我正在使用Cloudera的VM实例,该实例具有CentOS 6.4。 - SutharMonil
@SutharMonil 你确定文件实际存在吗?你能通过 hadoop fs -ls 浏览到那里吗? - Dennis Jaheruddin
只需使用 hadoop dfs -get <input> <output> 即可,它会正常工作。要列出文件,请使用 hadoop dfs -ls <path> - jbaranski

7
你可以通过这两种方式都实现。
1.hadoop fs -get <HDFS file path> <Local system directory path>
2.hadoop fs -copyToLocal <HDFS file path> <Local system directory path>

例:

我的文件位于/sourcedata/mydata.txt 我想将文件复制到本地文件系统的路径 /user/ravi/mydata

hadoop fs -get /sourcedata/mydata.txt /user/ravi/mydata/

7

如果你的源“文件”被划分为多个文件(可能是map-reduce的结果),并且这些文件都存储在同一目录树中,那么你可以使用以下命令将它们复制到本地文件:

hadoop fs -getmerge /hdfs/source/dir_root/ local/destination

这应该被接受。这是大多数人寻找的,而不是分割文件。 - James O'Brien
说实话,这将是最好的答案。通常,所有HDFS文件/表都像0000_0、0001_0那样分开存放在这些目录中。-getmerge会将所有这些文件合并并放入本地目录中的一个文件中。向@Eponymous致敬。 - didi

3

这个方法适用于我在Ubuntu虚拟机上的操作。

hdfs dfs -copyToLocal [Hadoop目录] [本地目录]


1

1.- 记住你给文件起的名字,不要使用hdfs dfs -put,而是使用'get'。如下所示。

$hdfs dfs -get /output-fileFolderName-In-hdfs


0

如果您正在使用Docker,则必须执行以下步骤:

  1. 从HDFS将文件复制到Namenode(hadoop fs -get output/part-r-00000 /out_text)。 “/out_text”将存储在Namenode上。

  2. 通过(docker cp namenode:/out_text output.txt)将文件从Namenode复制到本地磁盘

  3. output.txt将位于您的当前工作目录中


-3
bin/hadoop fs -put /localfs/destination/path /hdfs/source/path 

1
hdfs dfs -put 是将文件从本地文件系统推送到HDFS的命令。hdfs dfs -get 是正确的选项。 - b_rousseau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接