Hadoop Streaming: Mapper «обертывает» двоичный исполняемый файл

У меня есть конвейер, который я сейчас запускаю на большом университетском компьютерном кластере. В целях публикации я хотел бы преобразовать его в формат mapreduce, чтобы его мог запускать кто угодно, использующий кластер hadoop, такой как Amazon Webservices (AWS). В настоящее время конвейер состоит из серии сценариев python, которые обертывают различные двоичные исполняемые файлы и управляют вводом и выводом с помощью модулей подпроцесса python и временных файлов. К сожалению, я не писал двоичные исполняемые файлы, и многие из них либо не принимают STDIN, либо не выдают STDOUT в «удобном» виде (например, отправляют его только в файлы). Именно из-за этих проблем я обернул большинство из них в python.

До сих пор мне удавалось модифицировать свой код Python так, что у меня есть преобразователь и редуктор, которые я могу запускать на своей локальной машине в стандартном режиме ' тестовый формат. '

$ cat data.txt | mapper.py | reducer.py

Модуль отображения форматирует каждую строку данных так, как того требует двоичный файл, который он обертывает, отправляет текст в двоичный файл с помощью subprocess.popen (это также позволяет мне замаскировать множество ложных STDOUT), затем собирает STOUT я хочу, и форматирует его в строки текста, подходящие для редуктора. Проблемы возникают, когда я пытаюсь воспроизвести команду при локальной установке hadoop. Я могу запустить средство отображения, но он выдает ошибку, предполагающую, что он не может найти исполняемый двоичный файл.

Файл "/Users/me/Desktop/hadoop-0.21.0/./phyml.py", строка 69, в main () Файл "/Users/me/Desktop/hadoop-0.21.0/./mapper.py", строка 66, в основном phyml (Нет) Файл "/Users/me/Desktop/hadoop-0.21.0/./mapper.py", строка 46, в phyml ft = Popen (cli_parts, stdin = PIPE, stderr = PIPE, stdout = PIPE) Файл "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/subprocess.py", строка 621 в init errread, errwrite) Файл "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/subprocess.py", строка 1126 в _execute_child поднять child_exception OSError: [Errno 13] Permission denied

Моя команда hadoop выглядит следующим образом:

./bin/hadoop jar /Users/me/Desktop/hadoop-0.21.0/mapred/contrib/streaming/hadoop-0.21.0-streaming.jar \
-input /Users/me/Desktop/Code/AWS/temp/data.txt \
-output /Users/me/Desktop/aws_test \
-mapper  mapper.py \
-reducer  reducer.py \
-file /Users/me/Desktop/Code/AWS/temp/mapper.py \
-file /Users/me/Desktop/Code/AWS/temp/reducer.py \
-file /Users/me/Desktop/Code/AWS/temp/binary

Как я отмечал выше, мне кажется, что сопоставитель не знает о двоичном файле - возможно, он не отправляется на вычислительный узел ? К сожалению, я не могу точно сказать, в чем проблема. Любая помощь будет принята с благодарностью. Было бы особенно приятно увидеть некоторые преобразователи / редукторы потоковой передачи hadoop, написанные на python, которые обертывают двоичные исполняемые файлы. Не могу представить, что я первый, кто попробует это сделать! Фактически, вот еще одно сообщение, в котором задается, по сути, тот же вопрос, но на него еще нет ответа ...

Hadoop / Elastic Map Reduce с двоичным исполняемым файлом?

8
задан Community 23 May 2017 в 12:22
поделиться