2013-05-03 60 views
0

hadoop和mapreduce的新用户,我想创建一个mapreduce作业来对图像执行一些度量。这就是为什么我想知道我是否可以将图像作为输入映射到mapreduce?如果是的话?任何种类的例子使用图像创建mapreduce作业作为输入

感谢

回答

0

号。你不能直接,因为它使用特定类型的网络优化序列化的数据类型传递一个图像到MapReduce工作。我不是一个图像处理专家,但我会建议看看HIPI框架。它允许以方便的方式在MapReduce框架之上进行图像处理。

或者,如果你真的想这样做,本机Hadoop的方式,你可以首先将图像文件转换为Hadoop Sequence file,然后使用SequenceFileInputFormat处理文件做到这一点。

+0

任何如何将图像转换成hadoop sequene文件的例子? – devosJava 2013-05-03 23:38:39

+0

只是几分钟,我写了一个小代码来做到这一点,因为我没有意识到任何这样的链接。我很快就会贴上你的。 – Tariq 2013-05-04 00:16:13

+0

http://pastebin.com/RWttXN62 – Tariq 2013-05-04 01:07:50

0

是的,你完全可以做到这一点。

由于提供的信息有限,我只能给你一个非常一般的答案。无论哪种方式,你需要: 1)您将需要编写一个自定义的InputFormat,而不是在HDFS位置(如TextInputFormat和SequenceFileInputFormat做)中的文件块,它实际上传递给每个地图任务图像的HDFS路径名称。从中读取图像不会太难。如果你打算在图像的框架中传递一个Reduce阶段,你将需要: 2)你需要创建一个“ImageWritable”类来实现Writable(或者WritableComparable,重新键入图像)。在你的write()方法中,你需要将你的图像序列化为一个字节数组。当你这样做时,我要做的是首先向输出写入一个int/long,它是你要写入数组的大小。最后,你需要将数组写为字节。在您的read()方法中,您将首先读取一个int/long(它将描述图像的有效载荷),创建一个此大小的字节数组,然后将字节完全读入您的字节数组中到你捕获的int/long的长度。

我不完全确定你在做什么,但这就是我如何去做。

+0

我正在寻找与C++不工作,因为我想使用opencv来计算脸部特征 – devosJava 2013-05-04 00:07:36

+0

@Mike:说明用户是Hadoop的新手,编写自定义InputFormat并不容易。这就是为什么我提到Seq文件的原因。即使InputFormat对于他来说是可用的,如果他必须明确地读取文件,他将如何处理路径? – Tariq 2013-05-04 00:15:23