如何在mapper(Hadoop)中使用MATLAB代码?

我有一个处理图像的matlab代码。 我想创建一个使用该代码的Hadoop映射器。 我遇到了以下解决方案,但不确定哪一个是最好的(因为很难在hadoop中为每个从节点安装matlab编译器运行时):

  1. 手动将该matlab代码转换为C ++中的OpenCV,并从映射器调用其exe / dll(并提供适当的参数)。 不确定,因为群集在每个节点而不是Windows上安装了Linux。

  2. 使用Hadoop Streaming。 但是Hadoop流需要一个可执行文件作为映射器,而matlab的可执行文件也需要Matlab Compiler Runtime,这很难在每个从属节点上安装。

  3. 将其自动转换为C / C ++代码并自动创建其exe(不确定这是否正确,因为exe将要求运行matlab运行时,或者转换中可能存在很难修复的编译器问题)

  4. 使用Matlab Java Builder。 但是这样创建的jar文件也需要运行时。

有什么建议么?

提前致谢。

正如您可能已经怀疑的那样,由于MATLAB的运行时要求,这本身就很难做到。 尝试在Condor上运行MATLAB代码时,我有类似的经验(必须分发运行时库)。

就您列出的选项而言,选项#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的输出传递给sort实用程序(这只是一个例子,我们可以“ cat“任何文件,但由于我们知道al.oct是一个简单的文本文件,我们只使用它。

当然,Octave不支持您的MATLAB代码试图调用的所有内容,但这可能是使用Hadoop Streaming而不会失去更高级代码的便利性/function的替代方法。

要转换的算法的性质不重要吗? 如果MATLAB / Octave代码紧密耦合,则将其扩展到减少的映射可能会产生可怕的行为。

关于你的第一个选项:Matlab编码器现在支持许多图像处理function(部分通过系统对象)来自动生成算法的C代码,这基本上与平台无关,不需要运行时环境。 根据我的经验,这段代码比“手工编码”的OpenCV慢了2倍…(强烈依赖于你的算法和cpu)。 主要缺点是,您需要一个Matlab编码器许可证($$$)。

这里的大多数答案似乎都是MATLAB R2014b。

在R2014b中,MATLAB允许在MATLAB中进行mapreduce并与Hadoop集成。

我无法确定您的具体用例,但您可能需要检查:

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

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