Вопрос или проблема
У меня есть следующий код из терминала команд Fedora:
[root@localhost python_code]# pwd
/root/python_code
[root@localhost python_code]# cd ..
[root@localhost ~]# ls
anaconda-ks.cfg python_code
[root@localhost ~]# cd /usr/local
[root@localhost local]# ls
bin games hadoop-2.6.4.tar.gz input lib libexec sbin src
etc hadoop include jdk1.8.0_77 lib64 output share
[root@localhost local]# cd hadoop
[root@localhost hadoop]# ls
bin include libexec logs README.txt share
etc lib LICENSE.txt NOTICE.txt sbin
[root@localhost hadoop]# pwd
/usr/local/hadoop
[root@localhost hadoop]# bin/hdfs dfs -copyFromLocal /root/python_code/input_data.csv /usr/local/hadoop/input_localuser
copyFromLocal: `/usr/local/hadoop/input_localuser': Нет такого файла или каталога
[root@localhost hadoop]# ls
bin include libexec logs README.txt share
etc lib LICENSE.txt NOTICE.txt sbin
[root@localhost hadoop]# mkdir input_localuser
[root@localhost hadoop]# ls
bin include lib LICENSE.txt NOTICE.txt sbin
etc input_localuser libexec logs README.txt share
[root@localhost hadoop]# bin/hdfs dfs -copyFromLocal /root/python_code/input_data.csv /usr/local/hadoop/input_localuser
copyFromLocal: `/usr/local/hadoop/input_localuser': Нет такого файла или каталога
[root@localhost hadoop]# bin/hdfs dfs -copyFromLocal /root/python_code/input_data.csv home/usr/local/hadoop/input_localuser
copyFromLocal: `home/usr/local/hadoop/input_localuser': Нет такого файла или каталога
[root@localhost hadoop]# pwd
/usr/local/hadoop
[root@localhost hadoop]# ls
bin include lib LICENSE.txt NOTICE.txt sbin
etc input_localuser libexec logs README.txt share
[root@localhost hadoop]#
Больше кода:
[root@localhost hadoop]# cd ~
[root@localhost ~]# ls
anaconda-ks.cfg python_code
[root@localhost ~]# cd python_code
[root@localhost python_code]# ls
data_generator.py input_data.csv mapper_project.py reducer_project.py
[root@localhost python_code]#
Как видно выше, моя директория python_code
находится в корневой папке, и я пытаюсь скопировать файлы из этой папки в директорию input_localuser
, которая находится внутри hadoop.
Но следующая команда выдает ошибку:
bin/hdfs dfs -copyFromLocal /root/python_code/input_data.csv /usr/local/hadoop/input_localuser
copyFromLocal: `/usr/local/hadoop/input_localuser': Нет такого файла или каталога
Во-первых, ваша команда Hadoop, вероятно, неверна.
dfs -copyFromLocal
ожидает два параметра: локальный файл (как вы указали) и URI Hadoop. Не так, как вы это указали, а путь к файлу.
С веб-страниц Hadoop:
Все команды оболочки FS принимают URI пути в качестве аргументов. Формат URI это
scheme://authority/path. Для HDFS схема – hdfs, а для локальной файловой системы схема – file. Схема и авторитет являются необязательными. Если не указано, используется схема по умолчанию, указанная в конфигурации. HDFS файл или директория, такие как /parent/child, могут быть указаны как hdfs://namenodehost/parent/child или просто как /parent/child (при условии, что ваша конфигурация настроена на указание hdfs://namenodehost).Большинство команд в FS shell ведут себя как соответствующие команды Unix. Различия описаны для каждой из команд. Информация об ошибках отправляется в stderr, а вывод – в stdout.
Я не знаю структуру вашей инстанции Hadoop, но ваша цель должна основываться на этом, а не просто на файловой системе.
Во-вторых, вы не показали нам выше содержимое /root/python_code/
, вы уверены, что input_data.csv
существует?
Ответ или решение
При выполнении команды bin/hdfs dfs -copyFromLocal
вы столкнулись с ошибкой "No such file or directory". Давайте разберёмся, как решить эту проблему.
Причины ошибки
-
Неправильный путь назначения: команда
-copyFromLocal
ожидает в качестве второго параметра путь к директории в HDFS, а не путь к локальной файловой системе. Это ключевой момент, так как HDFS и локальная файловая система имеют разные структуры и формат путей. -
Проверка существования файла: вам необходимо убедиться, что файл
/root/python_code/input_data.csv
действительно существует и доступен при попытке его скопировать.
Шаги для решения проблемы
-
Проверьте доступность файла:
В терминале выполните команду:ls /root/python_code/input_data.csv
Если файл существует, вы увидите его в выводе. Если файла нет, вам необходимо указать правильный путь к файлу.
-
Используйте правильный синтаксис для HDFS:
Вместо:bin/hdfs dfs -copyFromLocal /root/python_code/input_data.csv /usr/local/hadoop/input_localuser
вам нужно использовать следующий формат:
bin/hdfs dfs -copyFromLocal /root/python_code/input_data.csv /input_localuser/
Обратите внимание, что путь назначения
/input_localuser/
в HDFS должен быть указан без привязки к локальной файловой системе. Убедитесь, что папка/input_localuser
уже существует в HDFS или создайте её с помощью:bin/hdfs dfs -mkdir /input_localuser
-
Запустите команду копирования снова:
Теперь, когда вы убедились, что файл существует и целевая директория корректна, выполните:bin/hdfs dfs -copyFromLocal /root/python_code/input_data.csv /input_localuser/
Заключение
Следуя указанным шагам, вы устраняете основные причины ошибки, и ваш файл должен успешно скопироваться в HDFS. Если проблемы сохранятся, убедитесь, что ваш Hadoop настроен правильно и что у вас есть необходимые права для выполнения операций с HDFS.