4

我有一个项目需要我处理大量(100-150MB)大图像(100-150MB)。我正在做的处理可以通过Imagemagick完成,但我希望在Amazon的Elastic MapReduce平台(我相信使用Hadoop运行)上实际执行此处理。使用Amazon MapReduce/Hadoop进行图像处理

在我发现的所有例子中,它们都处理基于文本的输入(我发现字数统计采样数十亿次)。我无法找到有关Hadoop的这类工作的任何信息:从一组文件开始,对每个文件执行相同的操作,然后将新文件的输出写出为自己的文件。

我很确定这可以用这个平台来完成,并且应该可以使用Bash完成;我不认为我需要去创建一个完整的Java应用程序或其他东西,但我可能是错的。

我不要求别人递给我的代码,但如果任何人有示例代码或链接处理类似问题的教程,这将是非常赞赏...

回答

9

你的任务有几个问题。

Hadoop不会像您看到的那样本机处理图像。但是,您可以将所有文件名和路径作为文本文件导出,并调用一些Map函数。因此,对本地磁盘上的文件调用ImageMagick应该不是什么大问题。

但是你如何处理数据局部性?

您无法在HDFS中的文件上运行ImageMagick(只有Java API和FUSE挂载不稳定),并且无法预测任务计划。因此,例如,可以将映射任务安排到图像不存在的主机。

确定您只需使用一台机器和一项任务即可。但是你没有改进。然后你会有一堆开销。

当您从Java任务中退出时还存在内存问题。我做了一篇关于它的博客文章[1]。

and should be able to be done using Bash 

这是下一个问题,你必须至少写map任务。您需要一个ProcessBuilder来调用具有特定路径和功能的ImageMagick。

我无法找到这样的工作与Hadoop的东西:有一组文件开始 ,执行相同的动作,以每个文件, 然后写出来的新文件的输出,因为它是自己的文件。

猜猜为什么? :D Hadoop不适合执行此任务。

所以基本上我会建议手动将图像拆分为EC2中的多个主机并在其上运行bash脚本。 压力小,速度快。要在同一台主机上执行并列操作,请将文件拆分为每个核心的多个文件夹,并在其上运行bash脚本。这应该很好地利用你的机器,并且比Hadoop有史以来的更好。

[1] http://codingwiththomas.blogspot.com/2011/07/dealing-with-outofmemoryerror-in-hadoop.html

+0

所以你说的Hadoop的图像主要是ginormous大小的图像,而不是ginormous数量的图像? – 2012-09-04 14:10:25

+0

@aaaaaaa根本没有。我认为Hadoop可以用于图像处理,但他的要求不适合Hadoop。但是,您是对的,少量的大尺寸图像比大量的小图像要好,尽管您可以忽略“CombineInputFormat”的许多问题,但仍然存在很大的开销。 –

0

你可以看看CombineFileInputFormat在Hadoop中,它可以根据文件隐式组合多个文件并分割它。

但我不确定你将如何处理100M-500M图像,因为它非常大,实际上比Hadoop的分割大小还要大。也许你可以尝试不同的方法将一个图像分成几个部分。

无论如何,祝你好运。

0

我一直在寻找解决方案,以应对大型遥感图像中的Hadoop很长一段时间。直到现在我什么都没有!

这是一个关于在Hadoop中将大规模图像拆分为samller的开源项目。我仔细阅读了代码并进行了测试。但是我发现演出不如预期。无论如何,这可能会有所帮助,并可以解决问题。

项目妈祖 http://www.cloudbook.net/directories/research-clouds/research-project.php?id=100057

祝你好运!

+0

这实际上是一个仅链接的答案;这样的答案是不鼓励的。 – dmckee

4

我想你可以看看“Hadoop:权威指南”第3版中的例子。附录C以bash的方式概述了如何获取文件(使用hdfs),解压缩文件,创建文件夹,从解压缩文件夹中的文件创建新文件,然后将该文件放入另一个hdfs位置。

我自己定制了这个脚本,这样最初的hadoop get就是一个curl调用web服务器,托管我需要的输入文件 - 我不想把所有的文件放在hdfs中。如果你的文件已经在hdfs中,那么你可以使用注释掉的行。 hdfs get或curl将确保该文件在本地可用于该任务。这里有很多网络开销。

不需要减少任务。

输入文件是用于转换/下载的文件的URL列表。

#!/usr/bin/env bash 

# NLineInputFormat gives a single line: key is offset, value is Isotropic Url 
read offset isofile 

# Retrieve file from Isotropic server to local disk 
echo "reporter:status:Retrieving $isofile" >&2 
target=`echo $isofile | awk '{split($0,a,"/");print a[5] a[6]}'` 
filename=$target.tar.bz2 
#$HADOOP_INSTALL/bin/hadoop fs -get $isofile ./$filename 
curl $isofile -o $filename 

# Un-bzip and un-tar the local file 
mkdir -p $target 
echo "reporter:status:Un-tarring $filename to $target" >&2 
tar jxf $filename -C $target 

# Take the file and do what you want with it. 
echo "reporter:status:Converting $target" >&2 
imagemagick convert .... $target/$filename $target.all 

# Put gzipped version into HDFS 
echo "reporter:status:Gzipping $target and putting in HDFS" >&2 
gzip -c $target.all | #$HADOOP_INSTALL/bin/hadoop fs -put - gz/$target.gz 

纽约时报使用Hadoop在24小时内将4TB的原始图像数据处理成pdf。这听起来像他们采取了类似的方法:http://open.blogs.nytimes.com/2007/11/01/self-service-prorated-super-computing-fun/?scp=1&sq=self%20service%20prorated&st=cse。他们使用java api,但其余部分是在本地获取文件,处理它,然后将其粘贴回hdfs/sc3。