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) в потоковом режиме, я предлагаю вам следовать этому контрольному списку:

  1. Сценарии запускаются? Не начинайте использовать переводчик т.е. python myScript.py сделать его исполняемым при запуске как ./myScript.py это способ, которым потоковая передача будет вызывать ваш скрипт.
  2. использование -verbose чтобы увидеть, что входит в банку, которая будет развернута в контейнере, иногда эта помощь.
  3. Внутри контейнеров скрипты являются символическими ссылками, а не реальными файлами.
  4. Файлы, которые перемещаются с помощью -file не в папках. -mapper folder/script.py или же -reducer folder/script.py рассматриваются как script.py
  5. Контейнеры и все, что находится внутри них, удаляются после завершения задания, если вы хотите увидеть, что происходит в контейнере, переместите его в 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, поэтому вам нужно дать ему разрешение на выполнение.

Другие вопросы по тегам