Разница между hadoop fs -put и hadoop fs -copyFromLocal

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

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


person snappy    schedule 18.10.2011    source источник
comment
пожалуйста, проверьте эту ссылку, в которой упоминаются подробности на уровне исходного кода hakunamapdata.com/   -  person Jagadish Talluri    schedule 01.10.2015


Ответы (5)


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

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

Так же,

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

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

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

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

person Ozair Kafray    schedule 18.10.2011

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

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

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

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

person Thomas Jungblut    schedule 18.10.2011
comment
Что вы имеете в виду, говоря, что API hdfs не будет знать, какой из них вы имеете в виду? Для '-put' источник всегда является первым аргументом. Или вы имеете в виду, что некоторые пользователи могут спутать «-put» с «-get»? - person snappy; 18.10.2011
comment
Нет, ни в коем случае. Здесь мы говорим о двух разных файловых системах. HDFS и локальная файловая система (например, ext4). При использовании bin/hadoop fs -put /tmp/somepath /user/hadoop/somepath команда фактически не знает, существует ли /tmp/somepath в обеих файловых системах или только в локальной файловой системе. То же самое с целевым путем. - person Thomas Jungblut; 18.10.2011
comment
Таким образом, первый параметр не всегда является, так сказать, локальным путем fs. Вы можете put с одной HDFS на другую, если хотите. -copyFromLocal гарантирует, что он просто выберет данные с локального диска и загрузит их в HDFS. - person Thomas Jungblut; 18.10.2011
comment
Зачем это нужно знать? Ваш пример команды (и вариант -copyFromLocal) всегда копирует /tmp/somepath/* из локального каталога в /user/hadoop/somepath/* в HDFS и создает каталоги /user/hadoop/somepath, если они еще не созданы. Правильно? - person snappy; 18.10.2011
comment
Нет, put предпочел бы схему HDFS вместо локальной файловой системы. copyFromLocal не будет этого делать и выберет его из локальной файловой системы. - person Thomas Jungblut; 19.10.2011
comment
Отличный ответ, спасибо за объяснение, почему вам когда-либо понадобится или вы захотите использовать -copyFromLocal - person James Allen; 01.07.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.

person Sylvain Leroux    schedule 28.10.2015

  • оба одинаковы, кроме
  • copyFromLocal запрещено копировать из локального, а put может брать файл из любого (другого hdfs/локальной файловой системы/..)
person Manish Agrawal    schedule 05.07.2015

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

person Roney J    schedule 15.03.2016
comment
Может быть, если вы укажете файловую систему в первом аргументе, он не будет читать локальную? hadoop fs -put hdfs:///test1/customer.txt hdfs:///test2? - person OneCricketeer; 21.02.2018