如何在映射器(Hadoop)中使用MATLAB代码?

2022-09-04 21:26:50

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

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

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

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

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

有什么建议吗?

提前致谢。


答案 1

正如您可能已经怀疑的那样,由于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 Streaming的另一种方式,而不会失去更高级别代码的便利性/功能。


答案 2

要转换的算法的性质难道不重要吗?如果 MATLAB/Octave 代码是紧密耦合的,那么将其分散在映射缩减上可能会产生可怕的行为。


推荐