Hadoop Streaming - невозможно найти ошибку файла
Я пытаюсь запустить потоковое задание Python.
bin/hadoop jar contrib/streaming/hadoop-0.20.1-streaming.jar
-D stream.non.zero.exit.is.failure=true
-input /ixml
-output /oxml
-mapper scripts/mapper.py
-file scripts/mapper.py
-inputreader "StreamXmlRecordReader,begin=channel,end=/channel"
-jobconf mapred.reduce.tasks=0
Я убедился, что mapper.py имеет все разрешения. Это ошибка, говоря
Caused by: java.io.IOException: Cannot run program "mapper.py":
error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:214)
... 19 more
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:53)
at java.lang.ProcessImpl.start(ProcessImpl.java:91)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
Я попытался скопировать mapper.py в hdfs и дать ту же ссылку hdfs://localhost/mapper.py, которая тоже не работает! Есть мысли о том, как исправить эту ошибку?
8 ответов
Глядя на пример на вики-странице HadoopStreaming, кажется, что вы должны изменить
-mapper scripts/mapper.py
-file scripts/mapper.py
в
-mapper mapper.py
-file scripts/mapper.py
так как "отправленные файлы идут в рабочий каталог". Вам также может понадобиться указать интерпретатор Python напрямую:
-mapper /path/to/python mapper.py
-file scripts/mapper.py
Ваша проблема, скорее всего, заключается в том, что исполняемый файл python не существует на ведомых устройствах (где работает TaskTracker). Java выдаст то же сообщение об ошибке.
Установите его везде, где он используется. В вашем файле вы можете использовать shebang, как вы, вероятно, уже делаете:
#!/usr/bin/python -O
rest
of
the
code
Убедитесь, что путь после шебанга совпадает с тем, где Python установлен на TaskTrackers.
Еще одна подлая вещь может вызвать это. Если ваши окончания строки в сценарии выполнены в стиле DOS, то ваша первая строка ("линия Шебанга") может выглядеть невооруженным глазом так:
#!/usr/bin/python
...my code here...
но его байты выглядят так для ядра, когда он пытается выполнить ваш скрипт:
% od -a myScript.py
0000000 # ! / u s r / b i n / p y t h o
0000020 n cr nl cr nl . . . m y sp c o d e sp
0000040 h e r e . . . cr nl
Он ищет исполняемый файл под названием "/usr/bin/python\r"
, который он не может найти, поэтому он умирает с "No such file or directory"
,
Это снова меня сегодня, так что мне пришлось записать это где-то на SO.
Я столкнулся с той же проблемой при запуске карты уменьшить с помощью кода Python. Решение: мы должны указать "-файл" перед маппером и редуктором.
Вот команда:
hadoop jar /opt/cloudera/parcels/CDH-5.12.2-1.cdh5.12.2.p0.4/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.12.2.jar **-file /home/mapper.py** -mapper /home/mapper.py **-file /home/reducer.py** -reducer /home/reducer.py -input /system/mainstream/tmp/file.txt -output /system/mainstream/tmp/output
Я столкнулся с точно такой же проблемой на кластере Hadoop CDH4, пытаясь запустить потоковое задание Python. Хитрость заключается в том, чтобы добавить в ваш файл маппера / редуктора первые строки:
import sys
sys.path.append('.')
Это заставит python выглядеть в текущем рабочем каталоге, и он сможет работать, а также убедиться, что ваш shebang правильный.
Я только что получил ту же ошибку, когда мой маппер возвращает пустую или пустую строку. Поэтому я должен был проверить значение:
try:
# Skip over any errors
word = words[18].strip()
if (len(word) == 0):
word = "UKNOWN"
print '%s\t%s' % (word, 1)
except Value:
pass
Ошибка "Файл не найден" иногда не означает "Файл не найден", а означает "Невозможно выполнить этот сценарий".
Зная это, я решил подобные проблемы, когда вы сталкиваетесь с проблемами (без Java) в потоковом режиме, я предлагаю вам следовать этому контрольному списку:
- Сценарии запускаются? Не начинайте использовать переводчик т.е.
python myScript.py
сделать его исполняемым при запуске как./myScript.py
это способ, которым потоковая передача будет вызывать ваш скрипт. - использование
-verbose
чтобы увидеть, что входит в банку, которая будет развернута в контейнере, иногда эта помощь. - Внутри контейнеров скрипты являются символическими ссылками, а не реальными файлами.
- Файлы, которые перемещаются с помощью
-file
не в папках.-mapper folder/script.py
или же-reducer folder/script.py
рассматриваются какscript.py
- Контейнеры и все, что находится внутри них, удаляются после завершения задания, если вы хотите увидеть, что происходит в контейнере, переместите его в HDFS, IE: замените маппер или редуктор сценарием.sh, который выполняет эту работу.
Этот контрольный список мне очень помог, надеюсь, может быть полезен и для вас.
Здесь следует классический журнал с неоднозначным сообщением об ошибке.
Это правда, он не может запустить программу.
Caused by: java.io.IOException: Cannot run program "/hadoop/yarn/local/usercache/root/appcache/application_1475243242823_0007/container_1475243242823_0007_01_000004/./reducer.py":
error=2, No such file or directory
Это причина лжи.
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:209)
... 15 more
Прочитай это:
Caused by: java.io.IOException: error=2, No such file or directory
Это ложь, файл существует, если -verbose показывает его в списке упаковки.
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:187)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
Есть ли у вашего mapper.py разрешение на выполнение? Если нет, то вам это нужно.
chmod a+x scripts/mapper.py
Hadoop разветвляет и запускает скрипт перед тем, как он пишет / читает в std, поэтому вам нужно дать ему разрешение на выполнение.