我有一个处理图像的matlab代码。我想创建一个使用该代码的Hadoop映射程序。我遇到了以下解决方案,但不确定哪一个是最好的(因为在hadoop中的每个从节点上安装matlab编译器运行时对我来说非常困难):
-
手动将matlab代码转换为C++中的OpenCV,并从映射器中调用其exe/dll(并为其提供适当的参数)。不确定,因为集群的每个节点上都安装了Linux,而不是Windows。
-
使用Hadoop流。但是Hadoop流需要一个可执行文件作为映射程序,而matlab的可执行文件也需要matlab编译器运行时,这很难安装在每个从属节点上。
-
自动将其转换为C/C++代码并自动创建其exe(不确定这是否正确,因为exe需要运行matlab运行时,或者在转换过程中可能存在编译器问题,很难解决)
-
使用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的输出通过管道发送到排序实用程序(这只是一个例子,我们可以使用"cat"任何文件,但由于我们知道al.oct是一个简单的文本文件,所以我们只使用它)。
当然,Octave可能不支持MATLAB代码试图调用的所有内容,但这可能是使用Hadoop流的另一种方式,而不会失去更高级别代码的便利性/功能。
要转换的算法的性质不重要吗?如果MATLAB/Octave代码是紧密耦合的,那么将其扩展到减少的映射上可能会产生可怕的行为。
关于您的第一个选项:Matlab Coder现在支持许多图像处理功能(部分通过系统对象)来自动生成算法的C代码,这基本上是独立于平台的,不需要运行时环境。根据我的经验,这段代码比"手工编码"的OpenCV慢了大约2.3倍(这在很大程度上取决于你的算法和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