-put
и -copyFromLocal
задокументированы как идентичные, хотя в большинстве примеров используется подробный вариант -copyFromLocal. Почему?
То же самое для -get
и -copyToLocal
-put
и -copyFromLocal
задокументированы как идентичные, хотя в большинстве примеров используется подробный вариант -copyFromLocal. Почему?
То же самое для -get
и -copyToLocal
Итак, в основном вы можете делать с put все, что вы делаете с copyFromLocal, но не наоборот.
Так же,
Следовательно, вы можете использовать get вместо copyToLocal, но не наоборот.
Ссылка: Документация Hadoop.
Обновление. Последнее обновление на октябрь 2015 года см. в этом ответе ниже.
Давайте рассмотрим пример: Если ваша HDFS содержит путь: /tmp/dir/abc.txt
И если ваш локальный диск также содержит этот путь, то API hdfs не будет знать, какой из них вы имеете в виду, если только вы не укажете схему типа file://
или hdfs://
. Возможно, он выбирает путь, который вы не хотели копировать.
Поэтому у вас есть -copyFromLocal
, который предотвращает случайное копирование неправильного файла, ограничивая параметр, который вы даете локальной файловой системе.
Put
для более продвинутых пользователей, которые знают, какую схему поставить впереди.
Новых пользователей Hadoop всегда немного сбивает с толку, в какой файловой системе они сейчас находятся и где на самом деле находятся их файлы.
bin/hadoop fs -put /tmp/somepath /user/hadoop/somepath
команда фактически не знает, существует ли /tmp/somepath
в обеих файловых системах или только в локальной файловой системе. То же самое с целевым путем.
- person Thomas Jungblut; 18.10.2011
put
с одной HDFS на другую, если хотите. -copyFromLocal
гарантирует, что он просто выберет данные с локального диска и загрузит их в HDFS.
- person Thomas Jungblut; 18.10.2011
Несмотря на то, что утверждает документация, на данный момент (октябрь 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
.
copyFromLocal
запрещено копировать из локального, а put
может брать файл из любого (другого hdfs/локальной файловой системы/..)Обе команды «put» и «copyFromLocal» работают одинаково. Вы не можете использовать команду «put» для копирования файлов из одного каталога hdfs в другой. Давайте посмотрим на это на примере: скажем, ваш корень имеет два каталога с именами «test1» и «test2». Если «test1» содержит файл «customer.txt», и вы пытаетесь скопировать его в каталог test2
$ hadoop fs -put /test1/customer.txt /test2, это приведет к ошибке «нет такого файла или каталога», поскольку « put' будет искать файл в локальной файловой системе, а не в hdfs. Оба они предназначены для копирования файлов (или каталогов) из локальной файловой системы только в hdfs.
hadoop fs -put hdfs:///test1/customer.txt hdfs:///test2
?
- person OneCricketeer; 21.02.2018