4

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

在我找到的所有示例中,它们都处理基于文本的输入(我发现 Word Count 样本十亿次)。我找不到关于 Hadoop 的这种工作的任何信息:从一组文件开始,对每个文件执行相同的操作,然后将新文件的输出写成它自己的文件。

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

我不是要求有人给我代码,但如果有人有示例代码或处理类似问题的教程链接,将不胜感激......

4

4 回答 4

9

你的任务有几个问题。

如您所见,Hadoop 不会原生处理图像。但是您可以将所有文件名和路径导出为文本文件并在其上调用一些 Map 函数。所以在本地磁盘上的文件上调用 ImageMagick 应该不是什么大问题。

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

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

当然,您可以只使用一台机器和一项任务。但是你没有任何改进。然后你就会有一堆开销。

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

and should be able to be done using Bash

这是下一个问题,您至少必须编写地图任务。您需要ProcessBuilder使用特定路径和功能调用 ImageMagick。

我找不到关于 Hadoop 的这种工作的任何信息:从一组文件开始,对每个文件执行相同的操作,然后将新文件的输出写成它自己的文件。

猜猜为什么?:D Hadoop 不适合这项任务。

所以基本上我会建议手动将您的图像拆分到 EC2 中的多个主机并在其上运行 bash 脚本。它压力更小,速度更快。要在同一主机上并行化,请将文件拆分为每个内核的多个文件夹并在其上运行 bash 脚本。这应该可以很好地利用您的机器,并且比 Hadoop 更好。

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

于 2011-10-19T19:01:21.260 回答
4

我认为您可以查看“Hadoop:权威指南”第 3 版中的示例。附录 C 概述了一种在 bash 中获取文件(在 hdfs 中)、解压缩、创建文件夹、从解压缩文件夹中的文件创建新文件然后将该文件放入另一个 hdfs 位置的方法。

我自己定制了这个脚本,因此最初的 hadoop get 是对托管我需要的输入文件的网络服务器的 curl 调用——我不想把所有文件都放在 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=塞。他们使用了 java api,但剩下的就是在本地获取文件,对其进行处理,然后将其粘贴回 hdfs/sc3。

于 2012-12-10T20:02:15.137 回答
0

你可以看看Hadoop中的CombineFileInputFormat,它可以隐式地组合多个文件并根据文件进行拆分。

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

无论如何,祝你好运。

于 2011-10-19T13:26:44.590 回答
0

长期以来,我一直在寻找在 Hadoop 中处理大规模遥感图像的解决方案。而我到现在一无所获!

这是一个关于在 Hadoop 中将大规模图像拆分为更小图像的开源项目。我仔细阅读了代码并对其进行了测试。但我发现表演并没有想象中那么好。无论如何,它可能会有所帮助并阐明问题。

马祖计划: http ://www.cloudbook.net/directories/research-clouds/research-project.php?id=100057

祝你好运!

于 2012-02-23T03:06:37.567 回答