2012-03-31 7 views
13

У меня есть код matlab, который обрабатывает изображения. Я хочу создать сопоставитель Hadoop, который использует этот код. Я наткнулся на следующие решения, но не уверены, какой из них лучше (как это очень трудно установить MatLab выполнения компилятор на каждого подчиненного узла в Hadoop для меня):Как использовать код MATLAB в mapper (Hadoop)?

  1. вручную преобразовать этот код MatLab в OpenCV в C++ и вызвать его exe/dll (и предоставить ему соответствующие параметры) из устройства отображения. Не уверен, поскольку в кластере Linux установлен на каждом узле, а не на Windows.

  2. Использование Hadoop Streaming. Но для потоковой передачи Hadoop требуется исполняемый файл в качестве обработчика, а для исполняемого файла Matlab также требуется время выполнения Matlab Compiler Runtime, которое очень сложно установить на каждом подчиненном узле.

  3. Преобразуйте его автоматически в код C/C++ и создайте его exe автоматически (не уверен, что это правильно, потому что либо exe потребует выполнения runtime matlab, либо могут возникнуть проблемы с компилятором при преобразовании, которые очень трудно исправить)

  4. Использование Matlab Java Builder. Но созданный таким образом файл jar потребует времени выполнения.

Любые предложения?

Заранее спасибо.

ответ

9

Как вы, вероятно, уже подозреваете, это изначально сложно сделать из-за требования времени выполнения для MATLAB. У меня был аналогичный опыт (необходимость распределять библиотеки времени исполнения) при попытке запустить код MATLAB через Condor.

Что касается параметров, которые вы перечисляете, вариант № 1 будет работать лучше всего. Кроме того, вы, вероятно, не будете доступны, чтобы избежать работы с Linux.

Однако, если вы не хотите потерять удобство, предоставляемое программным обеспечением более высокого уровня (например, MATLAB, Octave, Scilab и др.), Вы можете попробовать потоковое воспроизведение Hadoop в сочетании с исполняемыми сценариями Octave.

В потоковом режиме Hadoop не заботятся о природе исполняемого файла (будь то исполняемый скрипт или исполняемый файл, в соответствии с этим (http://hadoop.apache.org/common/docs/r0.15.2/streaming .html)).

Все, что требуется, это то, что ему предоставляется «исполняемый файл», который, кроме того, может: a) читать из stdin, b) отправлять выходные данные на stdout.

Программы GNU Octave могут быть превращены в исполняемые сценарии (в Linux) с возможностью чтения из stdin и отправки вывода на stdout (http://www.gnu.org/software/octave/doc/interpreter/Executable -Octave-Programs.html).

В качестве простого примера рассмотрим следующее:

Создать файл (например, «al.oct») со следующим содержанием:

#!/bin/octave -qf (Please note, in my installation i had to use "#!/etc/alternatives/octave -qf") 
Q = fread(stdin); #Standard Octave/MATLAB code from here on 
disp(Q); 

Теперь из командной строки введите следующую команду:

chmod + x al.Октябре

al.oct теперь исполняемым ... Вы можете выполнить его с "./al.oct". Для того, чтобы увидеть, где STDIN, STDOUT вписывается в (так что вы можете использовать его с Hadoop), вы можете попробовать это:

>>cat al.oct|./al.oct|sort 

Или другими словами ... «кошка» файл al.oct, труба его выходной к исполняемому скрипту al.oct, а затем передать вывод al.oct в утилиту сортировки (это всего лишь пример, мы могли бы иметь «cat» любой файл, но поскольку мы знаем, что al.oct - это простой текстовый файл, мы просто используйте это).

Возможно, что Octave не поддерживает все, что пытается вызвать ваш код MATLAB, но это может быть альтернативный способ использования потоковой передачи Hadoop без потери удобства/мощности кода более высокого уровня.

+0

Великий предложение! Я попробую это. – Harsh

+0

Но я думаю, что мне нужно установить октаву в каждом рабочем узле кластера hadoop для этого, верно? Разве нет способа создать файл .out из октавного кода? Это было бы очень полезно .. – Harsh

+0

Да, это будет так: -/В настоящий момент невозможно скомпилировать Octave или даже транслитерировать октавный код на что-то исполняемое. См. [This] (http://stackoverflow.com/questions/5101219/how-do-i-convert-octave-code-to-c-or-c) и [это] (http: //octave.1599824 .n4.nabble.com/octave-to-independent-C-code-td1630298.html) (я не продолжил второй в течение длительного времени). Вам нужен какой-то контроль над вашими работниками ... Может быть, администраторы вашего сервиса могут помочь получить наиболее жизнеспособные из вышеперечисленных вариантов работы (?). –

2

Не меняется ли природа алгоритма? Если код MATLAB/Octave тесно связан, распространение его по уменьшенному карте может привести к ужасному поведению.

2

В отношении вашего первого варианта: Matlab Coder теперь поддерживает множество функций обработки изображений (частично через системные объекты), чтобы автоматически генерировать C-код вашего алгоритма, который в основном независим от платформы и не требует среды выполнения. По моему опыту, этот код имеет коэффициент 2..3 медленнее, чем «ручной код» OpenCV (сильно зависит от вашего алгоритма и процессора). Главный недостаток - вам нужна лицензия Matlab Coder ($$$).

0

Большинство ответов здесь, кажется, является предварительным MATLAB R2014b.

В R2014b MATLAB позволяет преобразовывать карту из MATLAB и интегрироваться с Hadoop.

Я не могу быть уверен в вашем конкретном случае использования, но вы можете проверить:

http://www.mathworks.com/help/matlab/mapreduce.html

http://www.mathworks.com/discovery/matlab-mapreduce-hadoop.html

Смежные вопросы