локальный файл distcp для hadoop

У меня есть файл размером 1 Гб в локальной файловой системе /tmp/dist_testfle

Я могу скопировать это: hadoop fs -put file:///tmp/dist_testfile maprfs:///

Но не может расшифровать его. Команда hadoop distcp file:///tmp/dist_testfile maprfs:/// вызывает FileNotFoundException

20/05/19 15:57:40 INFO tools.DistCp: DistCp job-id: job_1588609058920_0136
20/05/19 15:57:40 INFO mapreduce.Job: Running job: job_1588609058920_0136
20/05/19 15:57:46 INFO mapreduce.Job: Job job_1588609058920_0136 running in uber mode : false
20/05/19 15:57:46 INFO mapreduce.Job:  map 0% reduce 0%
20/05/19 15:57:50 INFO mapreduce.Job: Task Id : attempt_1588609058920_0136_m_000000_0, Status : FAILED
Error: java.io.IOException: org.apache.hadoop.tools.mapred.RetriableFileCopyCommand$CopyReadException: java.io.FileNotFoundException: File file:///tmp/dist_testfile does not exist
    at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:250)
    at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:52)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:796)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:346)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1669)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: org.apache.hadoop.tools.mapred.RetriableFileCopyCommand$CopyReadException: java.io.FileNotFoundException: File file:///tmp/dist_testfile does not exist
    ... 10 more

Почему он выдает Exception. Наконец, как скопировать файл с distcp из локальной ФС в hadoop?


person Takito Isumoro    schedule 19.05.2020    source источник
comment
DistCp предназначен для копирования файлов из одного кластера в другой кластер, а не для копирования из локального в Hadoop.   -  person Ranga Vure    schedule 19.05.2020
comment
Попробуйте вместо этого использовать команду hfs dfs -copyFromLocal local_path clutter_path.   -  person Tsvetelina Mariyanova    schedule 19.05.2020


Ответы (1)


В вопросе недостаточно информации, чтобы быть уверенным, что вы получите полный ответ. В частности, не совсем ясно, удален ли ваш кластер MapR от того места, где находятся ваши локальные данные.

Если мы немного отвлечемся от distcp, то увидим, что обычный способ копирования файла из локального хранилища файлов в систему MapR вообще не использует команды hadoop. Эти команды, как правило, очень медленно запускаются и потребляют огромное количество памяти, усложняя простые задачи. Таким образом, я мог бы сделать это, чтобы скопировать файл

cp /tmp/dist_testfile /mapr/metrics-cluster/home/tdunning/tmp-dir

В этом есть несколько тонкостей. Во-первых, мы используем обычные команды Linux. Мы могли бы также использовать rsync для создания инкрементной копии. Это отлично подходит для относительно небольших файлов (менее нескольких ГБ), поскольку ограниченная скорость передачи для одного процесса (обычно менее 2 ГБ/с) компенсируется значительно более быстрым временем запуска. Во-вторых, это предполагает, что мы смонтировали файловую систему MapR на локальном компьютере. Это можно сделать с помощью NFS или драйвера POSIX (последний обычно лучше). В-третьих, я указал в команде имя кластера, на который хочу выполнить перенос (metrics-cluster). Если настроить доступ, это мог быть любой кластер, который я мог видеть, близкий или дальний.

Это все хорошо и хорошо. Часто гораздо лучше использовать этот стиль, чем использовать более сложный инструмент. То же самое касается написания простых программ или даже сложных программ, которые будут работать в Kubernetes.

Если, с другой стороны, вы хотите не столько передать один файл, сколько отладить, как заставить distcp работать, у нас другой котел с рыбой.

Первым шагом в отладке distcp является определение некоторых вещей.

a) имеет ли distcp доступ к jar-файлам MapR, которые обеспечивают реализацию HDFS, которая может получить доступ к MapR FS? Самый простой способ сделать это — использовать предоставленный MapR distcp, так как он поставляется со всем предварительно интегрированным. Поскольку кажется, что команды hadoop fs работают, создается впечатление, что у вас есть правильная установка MapR, но возможно, что у вас есть distcp извне этой установки.

б) правильно ли настроена локальная машина для доступа к кластеру, в который вы хотите писать? Опять же, учитывая, что команда hadoop fs работает, похоже, что и вы.

c) являются ли аргументы distcp абсолютно правильными. Это, по моему опыту, самая распространенная проблема. Анализ аргументов в различных командах Hadoop, таких как distcp, известен своей ненадежностью. Частично это код, но частично это связано с тем, что простые вещи, такие как клавиша табуляции для завершения файла, зависят от оболочки, имеющей доступ к файлам через обычные пути. Это разлетается на части, когда вы начинаете включать схему файловой системы. Я не могу комментировать синтаксис вашей команды, так как я почти никогда не использую distcp (я использую более простые методы), но я могу сказать, что я слышал о ряде пользователей, испытывающих трудности с тем, чтобы заставить его работать должным образом. Возможно, правильный ответ — держать рот правильно (кстати, это была шутка).

г) наконец, можете ли вы проверить, правильно ли настроена локальная файловая система в ваших конфигурационных файлах Hadoop? У меня были пользователи, которые меняли файл: на локальный: и тогда они очень запутались.

person Ted Dunning    schedule 20.05.2020