Как использовать код MATLAB в mapper (Hadoop)?

У меня есть код matlab, который обрабатывает изображения. Я хочу создать сопоставитель Hadoop, который использует этот код. Я наткнулся на следующие решения, но не уверен, какой из них лучше (поскольку очень сложно установить время исполнения компилятора Matlab на каждом подчиненном узле в 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 потребует времени выполнения.

Какие-либо предложения?

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

Ответ 1

Поскольку вы, вероятно, уже подозреваете, это будет сложно выполнить из-за требования к времени выполнения для 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.oct

Теперь al.oct является исполняемым файлом... Вы можете выполнить его с помощью "./al.oct". Чтобы увидеть, где находится stdin, stdout (чтобы вы могли использовать его с Hadoop), вы можете попробовать следующее:

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

Большинство ответов здесь похоже на предварительный MATLAB R2014b.

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

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

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

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