在mapreduce中从HDFS读取大图像

时间:2013-07-02 12:26:44

标签: java image-processing hadoop

HDFS中有一个非常大的图像(~200MB)(块大小为64MB)。我想知道以下内容:

  1. 如何在mapReduce作业中读取图像?

  2. 许多主题都提示WholeInputFormat。还有其他选择吗?怎么做?

  3. 使用WholeInputFormat时,是否会对块进行并行处理?我猜不是。

3 个答案:

答案 0 :(得分:0)

如果您的块大小为64 MB,则很可能HDFS会将您的映像文件拆分为块并在整个群集中复制它,具体取决于您的群集配置。

假设您想要将图像文件作为1条记录而不是多条块/逐行处理,我可以考虑以下几个选项来处理整个图像文件。

  1. 您可以实现自定义输入格式和记录阅读器。输入格式的isSplitable()方法应返回false。 RecordReader.next(LongWritable pos,RecType val)方法应该读取整个文件并将val设置为文件内容。这将确保 整个文件作为单个记录转到一个地图任务。

  2. 您可以对输入格式进行子类化并覆盖isSplitable()方法,以使其返回false。 This示例显示如何创建子类
    SequenceFileInputFormat实现NonSplittableSequenceFileInputFormat。

答案 1 :(得分:0)

虽然您可以使用WholeFileInputFormat或SequenceFileInputFormat或其他自定义来读取图像文件,但实际问题(在我看来)是从读取文件中抽取一些东西。好的..你已经阅读了文件,现在是什么?你将如何处理你的图像以检测你的mapper中的任何对象。我不是说这是不可能的,但这需要做很多工作。

恕我直言,你最好使用像HIPI这样的东西。 HIPI提供了一个API,用于在MapReduce框架之上执行图像处理任务。

修改:

如果你真的想按照自己的方式去做,那么你需要编写一个自定义的InputFormat。由于图像与文本文件不同,因此不能使用\n之类的分隔符来创建分割。一种可能的解决方法是根据给定的字节数创建拆分。例如,如果您的图像文件是200MB,您可以编写一个InputFormat,它将创建100MB的拆分(或者您在作业配置中作为参数提供的任何内容)。很久以前,我在处理一些二进制文件时遇到过这样的情况,这个project给了我很多帮助。

HTH

答案 2 :(得分:0)

我想这取决于你想要执行什么类型的处理。如果您正在尝试执行可以完成的事情,首先将大输入分成较小的图像文件,然后独立处理块,最后将输出部分拼接回大的最终输出 - 那么它可能是可能的。我不是图像专家,但想想如果你想将彩色图像变成灰度,那么你可能会将大图像切割成小图像。然后使用MR并行转换它们。完成映射器后,将它们缝合回一个大的灰度图像。

如果您了解图像的格式,那么您可以编写自己的记录阅读器,以帮助框架理解记录边界,防止在输入到映射器时出现损坏。