java—在mapreduce中从hdfs读取大图像

oipij1gg  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(392)

hdfs(块大小64mb)中有一个非常大的图像(~200mb)。我想知道以下几点:
如何在mapreduce作业中读取图像?
许多主题建议使用完整的输入格式。还有其他选择吗?怎么做?
当使用wholeinputformat时,是否会对块进行并行处理?我想没有。

s3fp2yjn

s3fp2yjn1#

我想这取决于你想执行什么类型的处理。如果您试图执行一些可以完成的操作,首先将较大的输入拆分为较小的图像文件,然后独立处理块,最后将输出部分缝合回较大的最终输出,那么这是可能的。我不是图像Maven,但如果你想把彩色图像变成灰度,那么你可以把大的图像切成小的图像。然后使用mr并行转换,一旦Map完成,然后将它们缝合回一个大的灰度图像。
如果您了解图像的格式,那么您可以编写自己的recordreader,以帮助框架了解记录边界,从而在将它们输入到Map器时防止损坏。

sqserrrh

sqserrrh2#

如果您的块大小是64MB,hdfs很可能会将您的映像文件分割成块并跨集群复制,这取决于您的集群配置。
假设您希望将图像文件处理为一条记录,而不是一行一行地处理多个块,下面是我可以想到的几个选项来处理整个图像文件。
可以实现自定义输入格式和记录读取器。输入格式的issplitable()方法应返回false。recordreader.next(longwritable pos,rectype val)方法应该读取整个文件,并将val设置为文件内容。这将确保整个文件作为一条记录转到一个Map任务。
可以对输入格式进行子类化,并重写issplitable()方法,使其返回false。这个例子展示了如何创建一个子类
sequencefileinputformat以实现不可分割的sequencefileinputformat。

ogq8wdun

ogq8wdun3#

尽管可以使用wholefileinputformat或sequencefileinputformat或其他自定义的方法来读取图像文件,但实际问题(在我看来)是从读取的文件中提取一些内容。好的..你已经读过文件了,现在怎么办?你将如何处理你的图像来检测你的Map器中的任何物体。我不是说这不可能,但这需要做很多工作。
嗯,你最好用hipi之类的东西。hipi提供了一个api,用于在mapreduce框架上执行图像处理任务。
编辑:
如果您真的想按自己的方式来做,那么您需要编写一个定制的inputformat。因为图像不像文本文件,所以不能使用像这样的分隔符 \n 用于拆分创建。一种可能的解决方法是根据给定的字节数创建拆分。例如,如果您的图像文件是200mb的,您可以编写一个inputformat,它将创建100mb的拆分(或者在作业配置中作为参数提供的任何内容)。很久以前,我在处理一些二进制文件时遇到过这样的情况,这个项目对我帮助很大。
hth公司

相关问题