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

-put-copyFromLocallogging为相同,而大多数示例使用详细variables-copyFromLocal。 为什么?

-get-copyToLocal同样的事情

  • copyFromLocalput命令类似,只是源限制为本地文件引用。

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

同样的,

  • copyToLocalget命令类似,只是目标被限制为本地文件引用。

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

参考 : Hadoop的文档 。

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

举个例子:如果你的HDFS包含path: /tmp/dir/abc.txt如果你的本地磁盘也包含这个path,那么hdfs API将不知道你的意思,除非你指定一个像file://的schemefile://hdfs:// 。 也许它会select你不想复制的path。

因此,您有-copyFromLocal这是通过限制您给本地文件系统的参数,防止您意外复制错误的文件。

Put是更高级的用户谁知道哪个scheme放在前面。

对于新的Hadoop用户来说,他们目前所在的文件系统以及文件的实际位置总是让人困惑。

尽pipe文档声称,截至目前(2015年10月),- -copyFromLocal-put都是一样的。

从在线帮助:

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

这可以通过查看源代码来确认, 在这里你可以看到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也是一样的。

  • 两者相同除外
  • copyFromLocal限制从本地复制,而put可以从任何文件(其他hdfs /本地文件系统/ ..)

'put'和'copyFromLocal'命令的作用完全相同。 您不能使用'put'命令将文件从一个hdfs目录复制到另一个。 让我们看一个例子:假设你的根目录有两个目录,命名为“test1”和“test2”。 如果'test1'包含一个'customer.txt'文件,并且您尝试将其复制到test2目录
$ hadoop fs -put /test1/customer.txt / test2这会导致'没有这样的文件或目录'错误,因为'put'将在本地文件系统中查找文件而不是hdfs。 它们都是为了将​​文件(或目录)从本地文件系统复制到hdfs而已。