Потоковая передача hadoop: похоже, что редуктор не работает, когда mapred.reduce.tasks=1

Я бегу базовый Map Reduce программа через hadoop-streaming

Map похоже

import sys

index = int(sys.argv[1])
max = 0
for line in sys.stdin:
    fields = line.strip().split(",")
    if fields[index].isdigit():
        val = int(fields[index])
        if val > max:
            max = val
else:
    print max

Я запускаю это как

hadoop jar /usr/local/Cellar/hadoop/1.0.3/libexec/contrib/streaming/hadoop-streaming-1.0.3.jar -D mapred.reduce.tasks=1 -input input -output output -mapper '/Users/hhimanshu/code/p/java/hadoop-programs/hadoop-programs/src/main/python_scripts/AttributeMax.py 8' -file /Users/me/code/p/java/hadoop-programs/hadoop-programs/src/main/python_scripts/AttributeMax.py

Я читаю в Hadoop в действии, mapred.reduce.tasks=1 является

Поскольку мы не указали какой-либо конкретный редуктор, он будет использовать IdentityReducer по умолчанию. Как следует из его названия, IdentityReducer передает свои данные прямо на выход.

Когда я вижу свою консоль, я вижу

12/07/30 16:01:33 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
12/07/30 16:01:33 WARN snappy.LoadSnappy: Snappy native library not loaded
12/07/30 16:01:33 INFO mapred.FileInputFormat: Total input paths to process : 1
12/07/30 16:01:34 INFO streaming.StreamJob: getLocalDirs(): [/Users/me/app/hadoop/tmp/mapred/local]
12/07/30 16:01:34 INFO streaming.StreamJob: Running job: job_201207291003_0037
12/07/30 16:01:34 INFO streaming.StreamJob: To kill this job, run:
12/07/30 16:01:34 INFO streaming.StreamJob: /usr/local/Cellar/hadoop/1.0.3/libexec/bin/../bin/hadoop job  -Dmapred.job.tracker=localhost:9001 -kill job_201207291003_0037
12/07/30 16:01:34 INFO streaming.StreamJob: Tracking URL: http://localhost:50030/jobdetails.jsp?jobid=job_201207291003_0037
12/07/30 16:01:35 INFO streaming.StreamJob:  map 0%  reduce 0%
12/07/30 16:01:51 INFO streaming.StreamJob:  map 100%  reduce 0%

Это не делает никакого прогресса, просто продолжает работать. Кажется, это не работает, как я могу это исправить?

ОБНОВИТЬ

  • когда D mapred.reduce.tasks=0Я вижу два файла part-00000 а также part-00001 оба файла имеют одну строку 0

  • когда D mapred.reduce.tasks=1 а также -reduce 'cat'поведение такое же, как если бы уменьшить ничего не делает

  • когда я бегу cat file | python AttibuteMax.py 8
    Я получаю 868

что значит D mapred.reduce.tasks=0 а также cat file | python AttributeMax.py 8 также не производят тот же результат (но они должны, верно?)

Что будет вызывать разницу в поведении, когда входные данные также одинаковы?

ОБНОВЛЕНИЕ 1

  • когда D mapred.reduce.tasks=0Я вижу 4 файла part-00000, part-00001, part-00002 а также part-00002 с одной строкой 268, 706, 348, 868 соответственно
  • и когда я бегу $ cat ~/Downloads/hadoop/input/apat63_99.txt | python ../../../src/main/python_scripts/AttributeMax.py 8 | cat Я вижу желаемый результат как 868

2 ответа

Вы получаете ожидаемый результат, когда вы установите mapred.reduce.tasks=0? Что делать, если вы укажете -reducer 'cat' с mapred.reduce.tasks=1? Одна из замечательных особенностей потоковой передачи заключается в том, что вы можете довольно эффективно протестировать ее из командной строки, используя каналы:

cat input | python mapper.py | sort | python reducer.py

но кажется, что ваше приложение не производит никакого вывода.

Не уверен насчет точного ответа, но для меня, как только я запустил его на кластере с машинами с лучшим хранилищем, он просто работал нормально:)

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