【问题标题】:Difference between hadoop fs -put and hadoop fs -copyFromLocalhadoop fs -put 和 hadoop fs -copyFromLocal 的区别
【发布时间】:2011-12-10 07:25:56
【问题描述】:

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

-get-copyToLocal 也一样

【问题讨论】:

标签: hadoop hdfs


【解决方案1】:

-copyFromLocal 类似于-put 命令,只是源仅限于本地文件引用。

所以基本上,你可以用 put 做所有你用-copyFromLocal 做的事情,但反之则不行。

同样,

-copyToLocal 类似于 get 命令,只是目标仅限于本地文件引用。

因此,您可以使用 get 代替 -copyToLocal,但反之则不行。

参考Hadoop's documentation.

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

【讨论】:

    【解决方案2】:

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

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

    Put 适用于更高级的用户,他们知道将哪个方案放在前面。

    对于新的 Hadoop 用户来说,他们当前所在的文件系统以及他们的文件实际在哪里总是有点困惑。

    【讨论】:

    • “hdfs API 不知道你指的是哪一个”是什么意思?对于“-put”,源始终是第一个参数。或者您的意思是有些用户可能会将“-put”与“-get”混淆?
    • 不,也不行。我们在这里谈论两种不同的文件系统。 HDFS 和本地文件系统(比如 ext4)。通过使用bin/hadoop fs -put /tmp/somepath /user/hadoop/somepath,该命令实际上不知道/tmp/somepath 是否存在于两个文件系统中,或者仅存在于本地文件系统中。与目标路径相同。
    • 所以第一个参数并不总是可以这么说的本地fs路径。如果您愿意,您可以 put 从一个 HDFS 到另一个。 -copyFromLocal 将确保它只是从本地磁盘中选择并上传到 HDFS。
    • 为什么需要知道?您的命令示例(和 -copyFromLocal 变体)始终将 /tmp/somepath/* 从本地复制到 HDFS 上的 /user/hadoop/somepath/* ,并创建 /user/hadoop/somepath 目录(如果尚未创建)。对吗?
    • 不,put 更喜欢 HDFS 方案而不是本地文件系统。 copyFromLocal 不会这样做并从本地文件系统中选择它。
    【解决方案3】:

    尽管文档声称,截至目前(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 的情况完全相同。

    【讨论】:

      【解决方案4】:
      • 两者都是一样的,除了
      • -copyFromLocal 仅限于从本地复制,而 -put 可以从任何(其他 HDFS/本地文件系统/..)获取文件

      【讨论】:

        【解决方案5】:

        -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?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多