hadoop和mapreduce的新用户,我想创建一个mapreduce作业来对图像进行一些测量。这就是为什么我想知道我是否可以将图像作为输入传递到mapreduce?如果是的话?任何一种例子
感谢
答案 0 :(得分:0)
否..您无法将图像直接传递给MapReduce作业,因为它使用针对网络序列化优化的特定类型的数据类型。我不是图像处理专家,但我建议你看一下HIPI框架。它允许以方便的方式在MapReduce框架之上进行图像处理。
或者如果您真的想以原生Hadoop方式实现,可以先将图像文件转换为Hadoop Sequence file,然后使用SequenceFileInputFormat处理文件。
答案 1 :(得分:0)
是的,你可以完全做到这一点。
由于提供的信息有限,我只能给你一个非常一般的答案。
无论哪种方式,您都需要: 1)您需要编写一个自定义的InputFormat而不是在HDFS位置(如TextInputFormat和SequenceFileInputFormat do)中获取文件块,它实际上将Image的HDFS路径名传递给每个map任务。从中读取图像不会太难。
如果您打算通过框架传递图像的Reduce阶段,则需要: 2)您将需要创建一个实现Writable的“ImageWritable”类(如果您正在键入图像,则需要WritableComparable)。在write()方法中,您需要将图像序列化为字节数组。当你这样做时,我要做的是首先向输出写一个int / long,这是你要编写的数组的大小。最后,您需要将数组写为字节。
在read()方法中,你将首先读取一个int / long(它将描述图像的有效负载),创建一个这个大小的字节数组,然后将字节完整地读入你的字节数组中,直到你捕获的int / long的长度。
我不完全确定你在做什么,但这就是我要做的事情。