hdfs(块大小64mb)中有一个非常大的图像(~200mb)。我想知道以下几点:如何在mapreduce作业中读取图像?许多主题建议使用完整的输入格式。还有其他选择吗?怎么做?当使用wholeinputformat时,是否会对块进行并行处理?我想没有。
s3fp2yjn1#
我想这取决于你想执行什么类型的处理。如果您试图执行一些可以完成的操作,首先将较大的输入拆分为较小的图像文件,然后独立处理块,最后将输出部分缝合回较大的最终输出,那么这是可能的。我不是图像Maven,但如果你想把彩色图像变成灰度,那么你可以把大的图像切成小的图像。然后使用mr并行转换,一旦Map完成,然后将它们缝合回一个大的灰度图像。如果您了解图像的格式,那么您可以编写自己的recordreader,以帮助框架了解记录边界,从而在将它们输入到Map器时防止损坏。
sqserrrh2#
如果您的块大小是64MB,hdfs很可能会将您的映像文件分割成块并跨集群复制,这取决于您的集群配置。假设您希望将图像文件处理为一条记录,而不是一行一行地处理多个块,下面是我可以想到的几个选项来处理整个图像文件。可以实现自定义输入格式和记录读取器。输入格式的issplitable()方法应返回false。recordreader.next(longwritable pos,rectype val)方法应该读取整个文件,并将val设置为文件内容。这将确保整个文件作为一条记录转到一个Map任务。可以对输入格式进行子类化,并重写issplitable()方法,使其返回false。这个例子展示了如何创建一个子类sequencefileinputformat以实现不可分割的sequencefileinputformat。
ogq8wdun3#
尽管可以使用wholefileinputformat或sequencefileinputformat或其他自定义的方法来读取图像文件,但实际问题(在我看来)是从读取的文件中提取一些内容。好的..你已经读过文件了,现在怎么办?你将如何处理你的图像来检测你的Map器中的任何物体。我不是说这不可能,但这需要做很多工作。嗯,你最好用hipi之类的东西。hipi提供了一个api,用于在mapreduce框架上执行图像处理任务。编辑:如果您真的想按自己的方式来做,那么您需要编写一个定制的inputformat。因为图像不像文本文件,所以不能使用像这样的分隔符 \n 用于拆分创建。一种可能的解决方法是根据给定的字节数创建拆分。例如,如果您的图像文件是200mb的,您可以编写一个inputformat,它将创建100mb的拆分(或者在作业配置中作为参数提供的任何内容)。很久以前,我在处理一些二进制文件时遇到过这样的情况,这个项目对我帮助很大。hth公司
\n
3条答案
按热度按时间s3fp2yjn1#
我想这取决于你想执行什么类型的处理。如果您试图执行一些可以完成的操作,首先将较大的输入拆分为较小的图像文件,然后独立处理块,最后将输出部分缝合回较大的最终输出,那么这是可能的。我不是图像Maven,但如果你想把彩色图像变成灰度,那么你可以把大的图像切成小的图像。然后使用mr并行转换,一旦Map完成,然后将它们缝合回一个大的灰度图像。
如果您了解图像的格式,那么您可以编写自己的recordreader,以帮助框架了解记录边界,从而在将它们输入到Map器时防止损坏。
sqserrrh2#
如果您的块大小是64MB,hdfs很可能会将您的映像文件分割成块并跨集群复制,这取决于您的集群配置。
假设您希望将图像文件处理为一条记录,而不是一行一行地处理多个块,下面是我可以想到的几个选项来处理整个图像文件。
可以实现自定义输入格式和记录读取器。输入格式的issplitable()方法应返回false。recordreader.next(longwritable pos,rectype val)方法应该读取整个文件,并将val设置为文件内容。这将确保整个文件作为一条记录转到一个Map任务。
可以对输入格式进行子类化,并重写issplitable()方法,使其返回false。这个例子展示了如何创建一个子类
sequencefileinputformat以实现不可分割的sequencefileinputformat。
ogq8wdun3#
尽管可以使用wholefileinputformat或sequencefileinputformat或其他自定义的方法来读取图像文件,但实际问题(在我看来)是从读取的文件中提取一些内容。好的..你已经读过文件了,现在怎么办?你将如何处理你的图像来检测你的Map器中的任何物体。我不是说这不可能,但这需要做很多工作。
嗯,你最好用hipi之类的东西。hipi提供了一个api,用于在mapreduce框架上执行图像处理任务。
编辑:
如果您真的想按自己的方式来做,那么您需要编写一个定制的inputformat。因为图像不像文本文件,所以不能使用像这样的分隔符
\n
用于拆分创建。一种可能的解决方法是根据给定的字节数创建拆分。例如,如果您的图像文件是200mb的,您可以编写一个inputformat,它将创建100mb的拆分(或者在作业配置中作为参数提供的任何内容)。很久以前,我在处理一些二进制文件时遇到过这样的情况,这个项目对我帮助很大。hth公司