HDFS 中有一个非常大的图像(~200MB)(块大小为 64MB)。我想知道以下内容:
如何在 mapReduce 作业中读取图像?
许多主题建议使用 WholeInputFormat。有没有其他选择以及如何做到这一点?
当使用 WholeInputFormat 时,是否会有任何块的并行处理?我觉得不是。
HDFS 中有一个非常大的图像(~200MB)(块大小为 64MB)。我想知道以下内容:
如何在 mapReduce 作业中读取图像?
许多主题建议使用 WholeInputFormat。有没有其他选择以及如何做到这一点?
当使用 WholeInputFormat 时,是否会有任何块的并行处理?我觉得不是。
我想这取决于您要执行的处理类型。如果您尝试执行可以首先将大输入拆分为较小的图像文件然后独立处理块并最终将输出部分拼接回大的最终输出的操作 - 那么它可能是可能的。我不是图像专家,但假设您想将彩色图像制作成灰度图像,那么您可能会将大图像切割成小图像。然后使用 MR 并行转换它们。一旦映射器完成,然后将它们缝合回一个大的灰度图像。
如果您了解图像的格式,那么您可以编写自己的记录读取器来帮助框架了解记录边界,以防止在将它们输入到映射器时发生损坏。
如果您的块大小为 64 MB,则很可能 HDFS 会将您的图像文件拆分为多个块并在整个集群中复制它,具体取决于您的集群配置。
假设您想将图像文件处理为 1 条记录而不是多个块/逐行,这里有一些我能想到的将图像文件作为一个整体来处理的选项。
您可以实现自定义输入格式和记录阅读器。输入格式中的 isSplitable() 方法应返回 false。RecordReader.next( LongWritable pos, RecType val ) 方法应该读取整个文件并将 val 设置为文件内容。这将确保整个文件作为单个记录转到一个地图任务。
您可以对输入格式进行子类化并覆盖 isSplitable() 方法,使其返回 false。此示例显示如何创建子类
SequenceFileInputFormat 来实现 NonSplittableSequenceFileInputFormat。
尽管您可以使用 WholeFileInputFormat 或 SequenceFileInputFormat 或自定义的东西来读取图像文件,但实际问题(在我看来)是从读取的文件中提取一些东西。好的..您已经阅读了文件,现在是什么?您将如何处理图像以检测映射器中的任何对象。我并不是说这是不可能的,但这需要做很多工作。
恕我直言,您最好使用HIPI 之类的东西。HIPI 提供了一个 API,用于在 MapReduce 框架之上执行图像处理任务。
编辑 :
如果你真的想按照自己的方式去做,那么你需要编写一个自定义的 InputFormat。由于图像不像文本文件,因此您不能使用分隔符\n
来创建拆分。一种可能的解决方法是根据给定的字节数创建拆分。例如,如果您的图像文件为 200MB,您可以编写一个 InputFormat,它将创建 100MB 的分割(或您在作业配置中作为参数提供的任何内容)。我很久以前在处理一些二进制文件时遇到过这样的情况,这个项目对我帮助很大。
高温高压