【发布时间】:2011-12-10 07:25:56
【问题描述】:
-put 和 -copyFromLocal 被记录为相同,而大多数示例使用详细变体 -copyFromLocal。为什么?
-get 和 -copyToLocal 也一样
【问题讨论】:
-
请查看此链接,其中提到了源代码级别的详细信息hakunamapdata.com/…
-put 和 -copyFromLocal 被记录为相同,而大多数示例使用详细变体 -copyFromLocal。为什么?
-get 和 -copyToLocal 也一样
【问题讨论】:
-copyFromLocal 类似于-put 命令,只是源仅限于本地文件引用。
所以基本上,你可以用 put 做所有你用-copyFromLocal 做的事情,但反之则不行。
同样,
-copyToLocal 类似于 get 命令,只是目标仅限于本地文件引用。
因此,您可以使用 get 代替 -copyToLocal,但反之则不行。
更新:有关 2015 年 10 月的最新信息,请参阅下面的 this 答案。
【讨论】:
我们举个例子:
如果您的 HDFS 包含路径:/tmp/dir/abc.txt
如果您的本地磁盘也包含此路径,那么 hdfs API 将不知道您指的是哪一个,除非您指定像 file:// 或 hdfs:// 这样的方案。也许它会选择你不想复制的路径。
因此您有-copyFromLocal,它通过限制您提供给本地文件系统的参数来防止您意外复制错误的文件。
Put 适用于更高级的用户,他们知道将哪个方案放在前面。
对于新的 Hadoop 用户来说,他们当前所在的文件系统以及他们的文件实际在哪里总是有点困惑。
【讨论】:
bin/hadoop fs -put /tmp/somepath /user/hadoop/somepath,该命令实际上不知道/tmp/somepath 是否存在于两个文件系统中,或者仅存在于本地文件系统中。与目标路径相同。
put 从一个 HDFS 到另一个。 -copyFromLocal 将确保它只是从本地磁盘中选择并上传到 HDFS。
尽管文档声称,截至目前(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 的情况完全相同。
【讨论】:
-copyFromLocal 仅限于从本地复制,而 -put 可以从任何(其他 HDFS/本地文件系统/..)获取文件【讨论】:
-put 和-copyFromLocal 命令的工作方式完全相同。您不能使用-put 命令将文件从一个 HDFS 目录复制到另一个目录。让我们看一个例子:假设你的根目录有两个目录,名为“test1”和“test2”。如果 'test1' 包含文件 'customer.txt' 并且您尝试将其复制到 test2 目录
$ hadoop fs -put /test1/customer.txt /test2
这将导致 'no such file or directory' 错误,因为 'put' 将在本地文件系统而不是 hdfs 中查找文件。
它们都只是为了将文件(或目录)从本地文件系统复制到 HDFS。
【讨论】:
hadoop fs -put hdfs:///test1/customer.txt hdfs:///test2?