Hadoop Streaming - не удается найти ошибку файла - PullRequest
8 голосов
/ 02 декабря 2010

Я пытаюсь запустить потоковое задание Python Hadoop.

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 ]

7 голосов
/ 03 декабря 2010

Глядя на пример на вики-странице 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 
3 голосов
/ 27 ноября 2012

Скорее всего, ваша проблема в том, что исполняемый файл python не существует на ведомых устройствах (где работает TaskTracker). Java выдаст то же сообщение об ошибке.

Установите его везде, где он используется. В вашем файле вы можете использовать shebang, как вы, вероятно, уже делаете:

#!/usr/bin/python -O
rest
of
the
code

Убедитесь, что путь после шебанга совпадает с тем, где Python установлен на TaskTrackers.

2 голосов
/ 17 октября 2013

Еще одна подлая вещь может вызвать это. Если ваши окончания строки в сценарии выполнены в стиле 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.

1 голос
/ 16 января 2018

Я столкнулся с той же проблемой при запуске карты редукции с кодом 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
1 голос
/ 23 января 2013

Я столкнулся с точно такой же проблемой в кластере Hadoop CDH4, пытаясь запустить потоковое задание Python. Хитрость заключается в том, чтобы добавить в ваш файл картографа / редуктора первые строки:

import sys
sys.path.append('.')

Это заставит python выглядеть в текущем рабочем каталоге, и он сможет работать, а также убедиться, что ваш shebang правильный.

0 голосов
/ 01 октября 2016

Ошибка «Файл не найден» иногда не означает «Файл не найден», а означает «Невозможно выполнить этот сценарий».

Зная это, я решил такие проблемы, как, когда вы сталкиваетесь с проблемами (без 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, который выполняет работу. 1021 *

Этот контрольный список мне очень помог, надеюсь, он может пригодиться и вам.

Здесь следует классический журнал с неоднозначным сообщением об ошибке.

Это правда, программа не запускается.

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)
0 голосов
/ 10 декабря 2010

Я только что получил ту же ошибку, когда мой маппер возвращает пустую или пустую строку. Поэтому я должен был проверить значение:

try:
    # Skip over any errors

    word = words[18].strip()

        if (len(word) == 0):
            word = "UKNOWN"

    print '%s\t%s' % (word, 1)

except Value:
    pass
0 голосов
/ 04 декабря 2010

Есть ли у вашего mapper.py разрешение на выполнение?Если нет, то вам это нужно.

chmod a+x scripts/mapper.py

Hadoop разветвляется и запускает скрипт перед тем, как он пишет / читает в std, поэтому вам нужно дать ему разрешение на выполнение для запуска.

...