我已经创建了一个Matlab程序,我必须在Hadoop中运行它。出于测试目的,我使用Octave进行Hadoop图像处理。我在Hadoop环境中使用集群。对于图像处理,我使用Hadoop流jar文件。为八度简单图像处理程序创建的Shell脚本。本地文件系统映像文件在shell脚本中使用成功。但现在我要在Hadoop环境中运行它。为此我应该给出存储在HDFS中的图像。我在Hadoop中尝试了这个,但它不会工作,不会给输出图像。例如
#!/bin/bash
/usr/bin/octave <<EOF
rgbImage = imread("/usr/2003vre.jpg");
imwrite(rgbImage,"/usr/OT/newnewnew.jpg");
这里我提到的文件路径是在本地文件系统中。请告诉我如何在此脚本中提供HDFS的输入文件路径。
请告诉我,我应该在哪里为这个八度程序(在脚本或hadoop流输入阶段内)提供输入,如下所示
hadoop@isro:/usr/local/grid/hadoop$ $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar -mapper /usr/OT/octave.sh -file /usr/OT/octave.sh input /usr/OT/2003vre.jpg -output /usr/OT/output
是否正确(输入和输出的格式)
提前致谢...
答案 0 :(得分:0)
请记住,Hadoop流mapreduce框架在stdin / stdout中使用键值对。因此,对于要获取输入的映射器,它必须从stdin读取并写入stdout一对或多对键值。
我认为在八度音阶中无法从stdin读取图像并将图像写入stdout。即你做不到:
rgbImage = imread("STDIN")
或
imwrite(rgbImage, "STDOUT")
此外,您无法在HDFS中为八度文件操作提供文件路径。如果您有自己的imread和imwrite二进制文件,它们通过stdin和stdout处理数据,那么您的工作流程将采用以下方式:
映射
#!/bin/bash
mapInpFileName=${map_input_file} # Get input file name from env.
img=`cat`
rbgImage=`imread < $img`
oupImage=`imwrite < $rbgImage`
printf "%s\t%s\n" "$mapInpFileName" "$oupImage"
让你的reducer身份。
您的输出(在HDFS中)将只是一个命名为part-0000的文件。该文件的格式为:
filename1 Content of Image 1
filename2 Content of Image 2
...
现在您知道,使用此文件可以通过某种编码生成图像。
对于hadoop流命令的输入和输出,将所有图像文件放在一个HDFS目录中,比如/ usr / INP /。然后做:
hadoop@isro:/usr/local/grid/hadoop$ $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar -mapper /usr/OT/octave.sh -file /usr/OT/octave.sh -input /usr/INP/ -output /usr/OT/output