Jak używać kodu MATLAB w maperze (Hadoop)?

Mam kod matlab, który przetwarza obrazy. Chcę stworzyć maper Hadoop, który używa tego kodu. Natknąłem się na następujące rozwiązania, ale nie wiem, które z nich jest najlepsze (ponieważ bardzo trudno jest zainstalować kompilator MATLAB na każdym węźle slave w hadoop dla mnie):

  1. Ręcznie przekonwertuj ten kod matlab na OpenCV w C++ i wywołaj jego exe / dll (i podaj mu odpowiednie parametry) z mapera. Nie jestem pewien, ponieważ klaster ma zainstalowanego Linuksa na każdym węźle zamiast Okna.

  2. Użyj Strumieniowania Hadoop. Ale Hadoop streaming wymaga pliku wykonywalnego jako maper i wykonywalny matlab wymaga również środowiska uruchomieniowego kompilatora Matlab, który jest bardzo trudny do zainstalowania na każdym węźle slave.

  3. Konwertuj go automatycznie do kodu C / C++ i utwórz jego exe automatycznie (nie wiem, czy jest to właściwe, ponieważ albo exe będzie wymagał uruchomienia środowiska uruchomieniowego matlab, albo mogą wystąpić problemy z kompilatorem w konwersji, które są bardzo trudne do fix)

  4. Użyj Programu MATLAB Java Builder. Ale utworzony w ten sposób plik jar będzie również potrzebował runtime.

Jakieś sugestie?

Z góry dzięki.

Author: Harsh, 2012-03-31

4 answers

Jak już zapewne podejrzewasz, będzie to z natury trudne do zrobienia ze względu na wymagania środowiska uruchomieniowego dla MATLAB. Miałem podobne doświadczenie (konieczność dystrybucji bibliotek runtime) podczas próby uruchomienia kodu MATLAB przez Condor.

Jeśli chodzi o opcje, które wymieniasz, opcja # 1 będzie działać najlepiej. Ponadto prawdopodobnie nie będziesz dostępny, aby uniknąć pracy z Linuksem.

Jednakże, jeśli nie chcesz stracić wygody zapewnianej przez oprogramowanie wyższego poziomu (takie jak MATLAB, Octave, Scilab i inne) można spróbować strumieniowania Hadoop w połączeniu ze skryptami wykonywalnymi Octave.

Hadoop streaming nie dba o naturę pliku wykonywalnego (czy jest to skrypt wykonywalny, czy plik wykonywalny, zgodnie z tym (http://hadoop.apache.org/common/docs/r0.15.2/streaming.html)).

Wszystko, czego wymaga, to to, że otrzymuje "wykonywalny", który dodatkowo może a) odczytywać ze standardowego wejścia, B) wysyłać wyjście do stdout.

Programy GNU Octave mogą być zamieniane w Skrypty wykonywalne (w Linuksie) z możliwością odczytu ze standardowego wejścia i wysłania wyjścia na stdout (http://www.gnu.org/software/octave/doc/interpreter/Executable-Octave-Programs.html).

Jako prosty przykład rozważ to:

Utwórz plik (na przykład "al.oct") o następującej treści:

#!/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);

Teraz z wiersza polecenia wydaj następujące polecenie:

Chmod +x al.oct

Al.oct jest teraz wykonywalny...Można go wykonać za pomocą "./ al.paź" Aby zobaczyć,gdzie pasuje stdin, stdout (tak, że można go używać z Hadoop) możesz spróbować tego:

>>cat al.oct|./al.oct|sort
Lub innymi słowy..."kot" teczka al.oct, przekierowanie jego wyjścia do skryptu wykonywalnego al.oct, a następnie podłączyć wyjście al.oct do narzędzia sort (to tylko przykład, możemy mieć " cat " dowolny plik, ale ponieważ wiemy, że al.oct jest prostym plikiem tekstowym, którego używamy).

To może być oczywiście Octave nie obsługuje wszystkiego, co twój kod MATLAB próbuje wywołać, ale może to być alternatywny sposób na korzystanie ze streamingu Hadoop bez utraty wygody / mocy kodu wyższego poziomu.

 9
Author: A_A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 13:02:03

Czy charakter konwertowanego algorytmu nie ma znaczenia? Jeśli kod MATLAB / Octave jest ściśle powiązany, rozłożenie go na mapie może spowodować okropne zachowanie.

 2
Author: Jan Galkowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 01:19:55

W odniesieniu do pierwszej opcji: koder Matlab obsługuje teraz wiele funkcji przetwarzania obrazu (częściowo poprzez obiekty systemowe), aby automatycznie wygenerować kod C twojego algorytmu, który jest w zasadzie niezależny od platformy i nie wymaga środowiska uruchomieniowego. Z mojego doświadczenia wynika, że kod ten ma współczynnik 2..3 wolniejszy niż" ręcznie kodowany " OpenCV(silnie zależy od algorytmu i procesora). Główną wadą jest to, że potrzebujesz licencji kodera Matlab ($$$).

 2
Author: kirk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-24 12:41:40

Większość odpowiedzi tutaj wydają się być pre MATLAB R2014B.

W R2014b, MATLAB umożliwia mapreduce z poziomu MATLAB i integrację z Hadoop.

Nie mam pewności co do twojego konkretnego przypadku użycia, ale możesz chcieć sprawdzić:

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

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

 0
Author: Aaditya Kalsi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 00:22:54