Mrjob в режиме hadoop: ошибка при запуске задания, неверный путь ввода: файл не существует

Я пытаюсь запустить пример Mrjob из книги Hadoop с Python на моем ноутбуке в псевдораспределенном режиме.

(файл salaries.csv можно найти здесь)

Итак, я могу запустить namenode и datanode:

start-dfs.sh

возвращает:

Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/me/hadoop-2.7.3/logs/hadoop-me-namenode-me-Notebook-PC.out
localhost: starting datanode, logging to /home/me/hadoop-2.7.3/logs/hadoop-me-datanode-me-Notebook-PC.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/me/hadoop-2.7.3/logs/hadoop-me-secondarynamenode-me-Notebook-PC.out

У меня также нет проблем с созданием структуры входного файла и копированием salaries.csv на hdfs:

hdfs dfs -mkdir /user/
hdfs dfs -mkdir /user/me/
hdfs dfs -mkdir /user/me/input/
hdfs dfs -put /home/me/Desktop/work/cv/hadoop/salaries.csv /user/me/input/
hdfs dfs -ls /user/me/input/

возвращает:

Found 1 items
-rw-r--r--   3 me supergroup    1771685 2016-12-24 15:57 /user/me/input/salaries.csv

Я также делаю top_salaries.py исполняемым файлом:

sudo chmod a+x /home/me/Desktop/work/cv/hadoop/top_salaries.py

запуск top_salaries.py в локальном режиме также работает:

python2 top_salaries.py -r local salaries.csv > answer.csv

возвращает:

No configs found; falling back on auto-configuration
Creating temp directory /tmp/top_salaries.me.20161224.195052.762894
Running step 1 of 1...
Counters: 1
    warn
        missing gross=3223
Counters: 1
    warn
        missing gross=3223
Streaming final output from /tmp/top_salaries.me.20161224.195052.762894/output...
Removing temp directory /tmp/top_salaries.me.20161224.195052.762894...

однако выполнение этого задания в хадупе (объединение вещей) python2 top_salaries.py -r hadoop hdfs:///user/me/input/salaries.csv возвращает:

No configs found; falling back on auto-configuration
Looking for hadoop binary in $PATH...
Found hadoop binary: /home/me/hadoop-2.7.3/bin/hadoop
Using Hadoop version 2.7.3
Looking for Hadoop streaming jar in /home/me/hadoop-2.7.3...
Found Hadoop streaming jar: /home/me/hadoop-2.7.3/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar
Creating temp directory /tmp/top_salaries.me.20161224.195201.967990
Copying local files to hdfs:///user/me/tmp/mrjob/top_salaries.me.20161224.195201.967990/files/...
Running step 1 of 1...
  session.id is deprecated. Instead, use dfs.metrics.session-id
  Initializing JVM Metrics with processName=JobTracker, sessionId=
  Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
  Cleaning up the staging area file:/tmp/hadoop-me/mapred/staging/me553683497/.staging/job_local553683497_0001
  Error launching job , bad input path : File does not exist: /tmp/hadoop-me/mapred/staging/me553683497/.staging/job_local553683497_0001/files/mrjob.zip#mrjob.zip
  Streaming Command Failed!
Attempting to fetch counters from logs...
Can't fetch history log; missing job ID
No counters found
Scanning logs for probable cause of failure...
Can't fetch history log; missing job ID
Can't fetch task logs; missing application ID
Step 1 of 1 failed: Command '['/home/me/hadoop-2.7.3/bin/hadoop', 'jar', '/home/me/hadoop-2.7.3/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar', '-files', 'hdfs:///user/me/tmp/mrjob/top_salaries.me.20161224.195201.967990/files/mrjob.zip#mrjob.zip,hdfs:///user/me/tmp/mrjob/top_salaries.me.20161224.195201.967990/files/setup-wrapper.sh#setup-wrapper.sh,hdfs:///user/me/tmp/mrjob/top_salaries.me.20161224.195201.967990/files/top_salaries.py#top_salaries.py', '-input', 'hdfs:///user/me/input/salaries.csv', '-output', 'hdfs:///user/me/tmp/mrjob/top_salaries.me.20161224.195201.967990/output', '-mapper', 'sh -ex setup-wrapper.sh python top_salaries.py --step-num=0 --mapper', '-combiner', 'sh -ex setup-wrapper.sh python top_salaries.py --step-num=0 --combiner', '-reducer', 'sh -ex setup-wrapper.sh python top_salaries.py --step-num=0 --reducer']' returned non-zero exit status 512

Редактировать:

это мой core-site.xml:

<configuration>
 <property>         
    <name>fs.defaultFS</name>         
    <value>hdfs://localhost:9000</value>    
 </property>
</configuration>

а это мой hdfs-site.xml:

<configuration>
    <property>
       <name>dfs.namenode.name.dir</name>
       <value>/home/me/Desktop/work/cv/hadoop/namenode</value>
    </property>
    <property>
       <name>dfs.datanode.data.dir</name>
       <value>/home/me/Desktop/work/cv/hadoop/datanode</value>
    </property>
</configuration>

(остальные файлы конфигурации xml, я не редактировал / не менял)

Edit2:

вот скрипт python (такой же, как на ссылке github выше)

from mrjob.job import MRJob
from mrjob.step import MRStep
import csv

cols = 'Name,JobTitle,AgencyID,Agency,HireDate,AnnualSalary,GrossPay'.split(',')

class salarymax(MRJob):

    def mapper(self, _, line):
        # Convert each line into a dictionary
        row = dict(zip(cols, [ a.strip() for a in csv.reader([line]).next()]))

        # Yield the salary
        yield 'salary', (float(row['AnnualSalary'][1:]), line)

        # Yield the gross pay
        try:
            yield 'gross', (float(row['GrossPay'][1:]), line)
        except ValueError:
            self.increment_counter('warn', 'missing gross', 1)

    def reducer(self, key, values):
        topten = []

        # For 'salary' and 'gross' compute the top 10
        for p in values:
            topten.append(p)
            topten.sort()
            topten = topten[-10:]

        for p in topten:
            yield key, p

    combiner = reducer

if __name__ == '__main__':
salarymax.run()

person user189035    schedule 24.12.2016    source источник
comment
он не может найти файл /tmp/hadoop-me/mapred/staging/me118248587/.staging/job_local118248587_0001/files/mrjob.zip#mrjob.zip проверьте копию файла.   -  person AdamSkywalker    schedule 24.12.2016
comment
xml файлы не имеют значения, я вижу пути, начинающиеся с / tmp / hadoop-me, hdfs: /// user / me, hdfs: /// user / hduser, это немного беспорядочно. Работа не может найти mrjob.zip # mrjob.zip, проверьте, как вы устанавливаете входные файлы для hadoop   -  person AdamSkywalker    schedule 24.12.2016
comment
Ха! Хороший улов. Но что мне делать, чтобы это исправить? Теперь я вижу, что это беспорядочно, но где мне установить эти каталоги, чтобы они были более аккуратными?   -  person user189035    schedule 24.12.2016
comment
используйте одного и того же пользователя для hadoop, чтобы все имена пользователей были одинаковыми. например hdfs dfs -mkdir / user / me / вместо hdfs dfs -mkdir / user / hduser /, а затем проверьте новые журналы ошибок   -  person AdamSkywalker    schedule 24.12.2016
comment
хорошо, я заменил hdfs dfs -mkdir /user/hduser/ на hdfs dfs -mkdir /user/me/, но почему-то все еще получаю те же ошибки; (   -  person user189035    schedule 24.12.2016
comment
добавьте свой код скрипта python   -  person AdamSkywalker    schedule 24.12.2016
comment
в ваших журналах я вижу Копирование локальных файлов в hdfs: ///user/me/tmp/mrjob/top_salaries.me.20161224.195201.967990/files/ .. - это означает, что ваша библиотека Python перемещает файлы в эту папку на hdfs. При запуске команды я вижу '-files', 'hdfs: ///user/me/tmp/mrjob/top_salaries.me.20161224.195201.967990/files/mrjob.zip#mrjob.zip. Это файлы, доступные для работы. Когда hadoop не работает, он говорит: Файл не существует: /tmp/hadoop-me/mapred/staging/me553683497/.staging/job_local553683497_0001/files/mrjob.zip#mrjob.zip   -  person AdamSkywalker    schedule 25.12.2016
comment
первые 2 пути совпадают, это хорошо. но hadoop по какой-то причине ищет локальную папку / tmp / hadoop-me / mapred / .. вместо того, чтобы принимать входные данные hdfs. на самом деле в журналах больше нет папки hadoop / mapred. есть некоторая неправильная конфигурация, и я не могу ее найти теоретически. есть несколько мест для проверки, например, основные журналы приложений и конфигурации xml, это требует немного терпения   -  person AdamSkywalker    schedule 25.12.2016
comment
@AdamSkywalker: прямо перед ошибкой я прочитал _1 _... разве очистка не виновата в том, что файл не был найден на следующем этапе?   -  person user189035    schedule 27.12.2016
comment
нет, чистка - результат первой ошибки   -  person AdamSkywalker    schedule 27.12.2016
comment
[Невозможно инициализировать метрики JVM с помощью processName = JobTracker, sessionId = - уже инициализировано] не может быть частью проблемы?   -  person Romain Jouin    schedule 29.12.2016
comment
@romainjouin: Я действительно ничего не знаю о hadoop / mrjob. Я просто пытаюсь запустить пример. FWIW, java -version returns openjdk version "1.8.0_111" OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-2ubuntu0.16.04.2-b14) OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)   -  person user189035    schedule 29.12.2016
comment
У меня такая же проблема, я пытаюсь запустить примеры из книги Hadoop с Python   -  person Alex Marandon    schedule 06.01.2017
comment
@AlexMarandon: спасибо за ваш комментарий. Я разместил это как проблему (поскольку вы это подтвердили) в git книги. Посмотрим, получим ли мы больше информации ...   -  person user189035    schedule 13.01.2017


Ответы (1)


Хорошо < / а>. Вам необходимо отредактировать файл core-site.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master:9000</value>
    </property>
</configuration>

и файл hdfs-site.xml как:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/edureka/hadoop-2.7.3/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/edureka/hadoop-2.7.3/datanode</value>
    </property>
</configuration>

и вам нужно отредактировать hdfs-site.xml как:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/edureka/hadoop-2.7.3/datanode</value>
    </property>
</configuration>

и вам нужно создать mapred-site.xml файл с содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

и вам нужно отредактировать yarn-site.xml, чтобы он содержал:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
</configuration>

Затем сделайте:

start-dfs.sh
start-yarn.sh

затем сделайте:

hdfs dfs -mkdir /user/
hdfs dfs -mkdir /user/me/
hdfs dfs -mkdir /user/me/input/
hdfs dfs -put /home/me/Desktop/work/cv/hadoop/salaries.csv /user/me/input/

сейчас делаю:

sudo chmod a+x /home/me/Desktop/work/cv/hadoop/top_salaries.py
python2 top_salaries.py -r hadoop  hdfs:///user/me/input/salaries.csv > answer.csv

работает.

person user42397    schedule 03.01.2017