hadoop fs -put和hadoop fs -copyFromLocal之间的区别

时间:2011-10-18 17:29:19

标签: hadoop hdfs

-put-copyFromLocal被记录为相同,而大多数示例使用详细变量-copyFromLocal。为什么呢?

-get-copyToLocal

也是如此

5 个答案:

答案 0 :(得分:58)

  • copyFromLocal 类似于 put 命令,但源仅限于本地文件引用。

所以,基本上你可以用 put 来做,所有你用 copyFromLocal 做的事情,但反之亦然。

同样,

  • copyToLocal 类似于 get 命令,但目标仅限于本地文件引用。

因此,您可以使用 get 而不是 copyToLocal ,但不能反过来。

参考Hadoop's documentation

更新:有关截至2015年10月的最新信息,请参阅下面的this回答。

答案 1 :(得分:37)

我们举一个例子: 如果您的HDFS包含路径:/tmp/dir/abc.txt 如果您的本地磁盘也包含此路径,那么除非您指定file://hdfs://等方案,否则hdfs API将不知道您的意思。也许它选择了你不想复制的路径。

因此,通过限制您为本地文件系统提供的参数,您-copyFromLocal可以防止意外复制错误的文件。

Put适用于了解哪种方案可以放在前面的更高级用户。

对于新的Hadoop用户来说,他们当前所处的文件系统以及他们的文件实际位置总是有点令人困惑。

答案 2 :(得分:17)

尽管文档声称,截至目前(2015年10月),-copyFromLocal-put都是相同的。

在线帮助:

[cloudera@quickstart ~]$ hdfs dfs -help copyFromLocal 
-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst> :
  Identical to the -put command.

这由looking at the sources确认,您可以在其中看到CopyFromLocal类扩展了Put类,但没有添加任何新行为:

  public static class CopyFromLocal extends Put {
    public static final String NAME = "copyFromLocal";
    public static final String USAGE = Put.USAGE;
    public static final String DESCRIPTION = "Identical to the -put command.";
  }

  public static class CopyToLocal extends Get {
    public static final String NAME = "copyToLocal";
    public static final String USAGE = Get.USAGE;
    public static final String DESCRIPTION = "Identical to the -get command.";
  }

正如您可能已经注意到的那样,get / copyToLocal的情况完全相同。

答案 3 :(得分:2)

  • 两者都相同,除了
  • copyFromLocal仅限于从本地复制,而put可以从任何文件中获取文件(其他hdfs / local filesystem /..)

答案 4 :(得分:0)

两者都放了&#39; &安培; &#39; copyFromLocal&#39;命令完全相同。你不能使用&#39; put&#39;命令将文件从一个hdfs目录复制到另一个目录。让我们看一个例子:说你的root有两个目录,名为&#39; test1&#39;和&#39; test2&#39;。如果&#39; test1&#39;包含一个文件&#39; customer.txt&#39;并尝试将其复制到test2目录
 $ hadoop fs -put /test1/customer.txt / test2 这将导致没有这样的文件或目录&#39;错误,因为&#39; put&#39;将在本地文件系统中查找该文件而不是hdfs。 它们都只是用于将文件(或目录)从本地文件系统复制到hdfs。