Пустой вывод из картографа python hadoop

Входной текст как таковой повторяется миллиард раз:

value1 | foo="bar" value2 | value3

Я написал базовый сопоставитель на питоне для базовой потоковой работы:

#!/usr/bin/env python
import sys
for line in sys.stdin:
    line = line.replace('foo=','')
    line = line.replace('"','') # kills double-quotes
    print line
    # alternatively, I have tried print >>sys.stdout, line

Я выполняю работу как таковую; он работает без ошибок, но выходной файл пуст:

bin/hadoop jar contrib/streaming/hadoop-streaming.jar -file ~/mapper1.py -mapper mapper1.py -input hdfs:///rawdata/0208head.txt -output hdfs:///rawdata/clean0208.txt

Я предположил, что без картографа печать будет просто печатать в выходной файл. Теперь я подозреваю, что команда печати просто печатает вывод в память каждой JavaVM, и без какого-либо явного способа записать его обратно он просто умирает в виртуальной машине.

Я написал базовый редюсер, который просто взял sys.stdin и напечатал в sys.stdout, как указано выше в «#alternatively». Это тоже не сработало.

Руководство приветствуется. Спасибо


person Todd Curry    schedule 15.04.2014    source источник
comment
Если вас устраивает ответ, то примите его.   -  person Cast_A_Way    schedule 16.04.2014


Ответы (1)


Я выполнил следующие шаги для выполнения задания потоковой передачи Hadoop:

1) Сначала я создал текстовый файл с именем head.txt, который содержит указанную вами строку.

value1 | foo="bar" value2 | value3

2) Затем я сохранил этот файл и поместил его в hdfs, используя:

hadoop fs -put /head.txt /head.txt

3) Я скопировал ваш код Python в файл mapper.py и после сохранения скопировал его в hdfs:

hadoop fs -put /mapper.py /mapper.py

4) Наконец, я выполнил следующую команду потоковой передачи Hadoop:

 hadoop jar /opt/hadoop/lib/hadoop-streaming-1.0.3.jar -D mapred.reduce.tasks=0 -file /mapper.py -mapper mapper.py -input /head.txt -output /out.txt

/opt/hadoop/lib/ — это путь к моей библиотеке Hadoop. Здесь вы можете добавить свой путь. Если вы установили HADOOP_HOME в файле .bashrc, то нет необходимости упоминать bin/hadoop.

В противном случае вы можете написать bin/hadoop для выполнения задания.

Это определенно сработает для вас. У меня есть следующий вывод в файле out.txt.

value1 | bar value2 | value3
person Cast_A_Way    schedule 15.04.2014
comment
Извините за задержку с ответом. Это не работает для меня, я сожалею. Вы правы, поместив туда -D mapped.reduce.tasks=0; Благодарю. Бит -file не нужен, если вы поместили mapper.py в hdfs. Но затем, когда я запускаю этот супер-базовый пример, как вы иллюстрируете, он определенно не работает. Можете ли вы попробовать убрать бит -file mapper.py, удалить цель и посмотреть, работает ли она? Мне это очень очень нужно для работы. Спасибо. - person Todd Curry; 16.04.2014
comment
какую версию хаупа и питона вы используете? - person Cast_A_Way; 16.04.2014
comment
Amazon Elastic MapReduce, который представляет собой Hadoop 1.0.3 (по крайней мере, так написано); Python 2.6.6 (установлен на все слейвы + мастер). Ни один из них не так нов, как хотелось бы, но 1.0.3 — самый стабильный вариант на Amazon. Я мог бы построить новый кластер, если потребуется - я в отчаянии, поскольку мне буквально нужно очистить миллиарды строк... Большое спасибо!! - person Todd Curry; 16.04.2014
comment
@Todd: Я хотел бы знать, почему вы упомянули путь ввода и вывода, например hdfs:///rawdata/0208head.txt, в котором есть 3 (/) после hdfs:. Я считаю, что это должно быть 2 косая черта (/). - person Cast_A_Way; 17.04.2014
comment
должно быть три, но я попытался просто переместить файлы в /user/hadoop, где требуется нулевая косая черта, а затем изменить задание потоковой передачи, чтобы отразить это. Нет игральных костей. - person Todd Curry; 17.04.2014