-put
и -copyFromLocal
документируются как идентичные, в то время как в большинстве примеров используется подробный вариант -copyFromLocal. Почему?
То же самое для -get
и -copyToLocal
-put
и -copyFromLocal
документируются как идентичные, в то время как в большинстве примеров используется подробный вариант -copyFromLocal. Почему?
То же самое для -get
и -copyToLocal
Итак, в основном вы можете сделать это с помощью всего, что вы делаете с copyFromLocal, но не наоборот.
Аналогично,
Следовательно, вы можете использовать get вместо copyToLocal, но не наоборот.
Ссылка: Документация Hadoop.
Обновление. Последнее обновление с октября 2015 года см. ниже .
Сделайте пример:
Если ваш HDFS содержит путь: /tmp/dir/abc.txt
И если ваш локальный диск также содержит этот путь, то API hdfs не будет знать, что вы имеете в виду, если не указать такую схему, как file://
или hdfs://
. Возможно, он выбирает путь, который вы не хотите копировать.
Поэтому у вас есть -copyFromLocal
, который предотвращает случайное копирование неправильного файла, ограничивая параметр, который вы даете локальной файловой системе.
Put
предназначен для более продвинутых пользователей, которые знают, какую схему поставить впереди.
Это всегда немного запутывает новых пользователей Hadoop, в которых они находятся в настоящее время и где находятся их файлы.
Несмотря на то, что заявлено в документации, на данный момент (октябрь 2015 г.) оба -copyFromLocal
и -put
совпадают.
В интерактивной справке:
[[email protected] ~]$ 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/local filesystem/..)Команды "put" и "copyFromLocal" работают точно так же. Вы не можете использовать команду "put" для копирования файлов из одного каталога hdfs в другой. Давайте посмотрим на это с примером: скажем, ваш корень имеет две директории с именем "test1" и "test2". Если "test1" содержит файл "customer.txt", и вы пытаетесь скопировать его в каталог test2
$ hadoop fs -put/test1/customer.txt/test2
Это приведет к ошибке "нет такого файла или каталога", поскольку "put" будет искать файл в локальной файловой системе, а не hdfs.
Они предназначены только для копирования файлов (или каталогов) из локальной файловой системы в hdfs.