我有一个系统可以从某个模块获取图像(jpg)。我一次获得10个对象(单个对象1000个图像)的图像(一次总共10000个图像)。我需要使用Hadoop集群对这些图像进行一些处理。
我想知道我应该怎么做。就像我应该如何形成输入。我想在一个mapper或reducer中完全处理一个对象(及其images = 1000)。例如:第一个映射器中的第一个对象,第二个映射器中的第二个对象等。
我想到的一些方法是: 1.为每个对象创建一个目录并将其所有图像放在其中。然后tar,压缩目录,这将作为单个映射器的一个输入。
执行与上面提到的相同的操作,但只是tar文件(不要压缩)。实现InputFormat接口并使“isSplittable()”返回false。
为每个对象创建序列文件。 Sequensfile将包含每个对象图像的键 - 值对。在这里,我不知道如何告诉MapReduce只将序列文件提供给一个映射器。
答案 0 :(得分:0)
对于所有文件输入格式,这里我不知道如何告诉MapReduce只将序列文件提供给一个映射器。
FileInputFormat#isSplitable是您的朋友。 SequenceFileInputFormat扩展了FileInputFormat。
答案 1 :(得分:-1)
使用MAPREDUCE处理HADOOP中的图像 HIPI:
Hipi是Hadoop图像处理接口。这提供了一组工具和Inputformat,可以使用Hadoops Distributes File System(HDFS)和Mapreduce处理大量图像。
参与的STPES:
在hipi中,整个过程可以分为两部分。
1)将所有图像转换为批量文件(HIPI Image Bundle)。
2)使用HIPI的图像输入格式处理创建的图像批量文件。 剔除(剔除类)用于过滤掉低透明度或缺陷的图像
与HIPI有关的问题:
为了模拟我的批量图像处理场景,我使用java程序在一个目录中创建具有不同名称的同一图像的多个副本。然后通过使用HIPI的实用程序,我将所有图像转换为批量文件(在HIPI中称为HIP文件)。
要检查批量文件中是否存在所有图像,我执行了相反的过程(将HIP文件转换为多个图像)。还有另一个实用程序可以做到这一点。但我没有得到所有图像,发现使用HIPI我丢失了一些图像。
我无法使用HIPI继续我的POC,并考虑使用mapreduce创建一个新的框架来处理批量图像。
新图像处理框架:
为了避免产生多个地图(每个文件),我们必须像HIPI一样,即将所有图像转换为单个捆绑文件。
此捆绑包文件作为map-reduce的输入。图像输入格式解析包文件并创建与每个图像对应的缓冲图像对象。
图像输入格式 - 重要类别:
Image Combiner:
将多个图像合并到一个捆绑文件中。
ImageInputFormat:
返回ImageRecordRreader,并管理拆分
ImageRecordReader: 管理阅读每个分裂。 执行文件指针的初始搜索,指向每个拆分的开始。 nextKeyValue()方法从拆分中读取每个Image并转换为BufferedImage。 BufferedImageWritable:
由于map reduce的键值类应该是可写的可序列化类型,我们不能将BufferedImage直接保存为map方法中的值。 这是一个包装类,只包含BufferedImage。
BufferedImageWritable { BufferedImage img;
@Override
public void readFields(DataInput arg0) throws IOException {
}
@Override
public void write(DataOutput arg0) throws IOException {
}
@Override
public int compareTo(byte[] o) {
return 0;
}
}
未实现readFiled(),write(),compareTo()方法,因为在我的场景中我不想将法师存储回HDFS。
如果要在HDFS中回写任何图像(在map或reduce中),您可能必须实现所有这些方法。在write()中,您可能需要编写逻辑来存储图像,就像我们在创建批量文件时编写图像一样。 readFiled()应该包含write()的相反逻辑。 compareTo()不需要实现,因为我们从不将此图像保存为map-reduce中的键(在map-reduce的排序面中调用compareTo())。
由于您将图像作为BufferedImages(图像处理的常见Java类)获取,因此很容易在其上轻松完成大部分操作。但是在HIPI的情况下,图像在地图的值中可以作为Hipi的FloatImage类使用,并且您可能会感到难以在其上进行操作。
我已成功使用此自定义输入格式和OpenCV实现了facedetection程序。
我用于开发相同代码的代码将很快在GitHub上共享
http://worldofbigdata-inaction.blogspot.in/2017/02/processing-images-in-hadoop-using.html