Потоковая передача 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
но кажется, что ваше приложение не производит никакого вывода.
Не уверен насчет точного ответа, но для меня, как только я запустил его на кластере с машинами с лучшим хранилищем, он просто работал нормально:)