Hadoop Streaming: Mapper 'wrapping' бинарный исполняемый файл

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

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

  • Преобразование строки в двоичный файл в python
  • Двоичное представление float в Python (бит не hex)
  • Поплавок в двоичный
  • изображение возврата фляжки, созданное из базы данных
  • Упаковка 4 Целые числа как ONE BYTE?
  • Двоичный набор двоичных файлов в Python?
  • $ cat data.txt | mapper.py | reducer.py 

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

    Файл «/Users/me/Desktop/hadoop-0.21.0/./phyml.py», строка 69, в главном () файле «/Users/me/Desktop/hadoop-0.21.0/./mapper.py» , строка 66, в основном phyml (None) Файл «/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 raise child_exception OSError: [Errno 13] Разрешение отклонено

    Моя команда 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 / Elastic Map Сократить с помощью бинарного исполняемого файла?

  • Может ли bin () быть перегружен как oct () и hex () в Python 2.6?
  • изображение возврата фляжки, созданное из базы данных
  • Преобразование строки в двоичный файл в python
  • Двоичное представление float в Python (бит не hex)
  • скрипт python для записи онлайн-видео в прямом эфире
  • записать выходной звук в python
  • 2 Solutions collect form web for “Hadoop Streaming: Mapper 'wrapping' бинарный исполняемый файл”

    После многих поисковых запросов (и т. Д.) Я понял, как включить исполняемые двоичные файлы / скрипты / модули, доступные для ваших карт / редукторов. Хитрость заключается в том, чтобы сначала загрузить все ваши файлы в хаоп.

     $ bin/hadoop dfs -copyFromLocal /local/file/system/module.py module.py 

    Затем вам нужно отформатировать команду потоковой передачи, как в следующем шаблоне:

     $ ./bin/hadoop jar /local/file/system/hadoop-0.21.0/mapred/contrib/streaming/hadoop-0.21.0-streaming.jar \ -file /local/file/system/data/data.txt \ -file /local/file/system/mapper.py \ -file /local/file/system/reducer.py \ -cacheFile hdfs://localhost:9000/user/you/module.py#module.py \ -input data.txt \ -output output/ \ -mapper mapper.py \ -reducer reducer.py \ -verbose 

    Если вы связываете модуль python, вам нужно добавить следующий код к вашим скриптам mapper / reducer:

     import sys sys.path.append('.') import module 

    Если вы получаете доступ к двоичным файлам с помощью подпроцесса, ваша команда должна выглядеть примерно так:

     cli = "./binary %s" % (argument) cli_parts = shlex.split(cli) mp = Popen(cli_parts, stdin=PIPE, stderr=PIPE, stdout=PIPE) mp.communicate()[0] 

    Надеюсь это поможет.

    Получил это, наконец,

     $pid = open2 (my $out, my $in, "./binary") or die "could not run open2"; 
    Python - лучший язык программирования в мире.