hadoop fs -put和hadoop fs -copyFromLocal之间的区别
-put
和-copyFromLocal
logging为相同,而大多数示例使用详细variables-copyFromLocal。 为什么?
-get
和-copyToLocal
同样的事情
- copyFromLocal与put命令类似,只是源限制为本地文件引用。
所以,基本上你可以用put来完成,你用copyFromLocal做的所有事情,反之亦然。
同样的,
- copyToLocal与get命令类似,只是目标被限制为本地文件引用。
因此,您可以使用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而已。