Разница между hadoop fs -put и hadoop fs -copyFromLocal - PullRequest
49 голосов
/ 18 октября 2011

-put и -copyFromLocal задокументированы как идентичные, в то время как в большинстве примеров используется подробный вариант -copyFromLocal.Почему?

То же самое для -get и -copyToLocal

Ответы [ 5 ]

58 голосов
/ 18 октября 2011
  • copyFromLocal аналогичен команде put , за исключением того, что источник ограничен локальной ссылкой на файл.

Итак, в основном вы можете делать с put , все, что вы делаете с copyFromLocal , но не наоборот.

Аналогично,

  • copyToLocal аналогичен команде get , за исключением того, что назначение ограничено ссылкой на локальный файл .

Следовательно, вы можете использовать get вместо copyToLocal , но не наоборот.

Ссылка : Документация Hadoop .

Обновление : самое позднее по состоянию на октябрь 2015 г. см. этот ответ ниже.

37 голосов
/ 18 октября 2011

Давайте сделаем пример: если ваша HDFS содержит путь: /tmp/dir/abc.txt И если ваш локальный диск также содержит этот путь, то hdfs API не будет знать, какой вы имеете в виду, если вы не укажете схему типа file:// илиhdfs://.Возможно, он выбирает путь, который вы не хотели копировать.

Поэтому у вас есть -copyFromLocal, который не позволяет вам случайно скопировать неправильный файл, ограничивая параметр, который вы задаете для локальной файловой системы.

Put для более продвинутых пользователей, которые знают, какую схему поставить перед собой.

Новых пользователей Hadoop всегда немного смущает, в какой файловой системе они находятся в данный момент и где находятся их файлы.

17 голосов
/ 28 октября 2015

Несмотря на то, что заявлено в документации, на данный момент (октябрь 2015 г.) оба значения -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.

2 голосов
/ 05 июля 2015
  • оба одинаковы, кроме
  • copyFromLocal ограничено копированием из локальной, в то время как put может принимать файлы из любой (другой hdfs / локальной файловой системы /..)
0 голосов
/ 15 марта 2016

Обе команды «put» и «copyFromLocal» работают абсолютно одинаково.Вы не можете использовать команду «put» для копирования файлов из одного каталога hdfs в другой.Давайте рассмотрим это на примере: скажем, у вашего корня есть две директории с именами 'test1' и 'test2'.Если 'test1' содержит файл 'customer.txt' и вы пытаетесь скопировать его в каталог test2
$ hadoop fs -put /test1/customer.txt / test2 Это приведет к ошибке «нет такого файла или каталога», посколькуput 'будет искать файл в локальной файловой системе, а не в hdfs.Они оба предназначены для копирования файлов (или каталогов) из локальной файловой системы только в hdfs.

...