Bash 使用Amazon MapReduce/Hadoop进行图像处理

Bash 使用Amazon MapReduce/Hadoop进行图像处理,bash,hadoop,amazon-web-services,imagemagick,elastic-map-reduce,Bash,Hadoop,Amazon Web Services,Imagemagick,Elastic Map Reduce,我有一个项目,需要我处理大量(1000-10000)大(100MB到500MB)图像。我正在做的处理可以通过Imagemagick完成,但我希望能够在Amazon的弹性MapReduce平台(我相信它是使用Hadoop运行的)上进行处理 在我找到的所有示例中,它们都处理基于文本的输入(我发现字数采样次数为10亿次)。我在Hadoop中找不到任何关于这类工作的信息:从一组文件开始,对每个文件执行相同的操作,然后将新文件的输出作为自己的文件写入 我非常确信这可以用这个平台来完成,并且应该可以用Bas

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

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

我非常确信这可以用这个平台来完成,并且应该可以用Bash来完成;我不认为我需要费心去创建一个完整的Java应用程序或其他东西,但我可能错了


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

您可以看看Hadoop中的CombineFileInputFormat,它可以根据文件隐式组合多个文件并将其拆分

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


无论如何,祝你好运。

你的任务有几个问题

正如您所看到的,Hadoop不会以本机方式处理图像。但您可以将所有文件名和路径导出为文本文件,并在其上调用一些映射函数。因此,在本地磁盘上的文件上调用ImageMagick应该不会太多

但是如何处理数据局部性

无法在HDFS中的文件上运行ImageMagick(只有Java API和FUSE mount不稳定),也无法预测任务调度。因此,例如,可以将映射任务调度到不存在映像的主机

当然,您可以只使用一台机器和一项任务。但是你没有进步。那你就有一大堆开销了

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

and should be able to be done using Bash
这是下一个问题,您必须至少编写映射任务。您需要一个
ProcessBuilder
来调用带有特定路径和函数的ImageMagick

我找不到任何关于Hadoop这种工作的东西:开始 使用一组文件,对每个文件执行相同的操作, 然后将新文件的输出作为自己的文件写入

猜猜为什么D Hadoop不是这个任务的正确选择

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


[1]

我一直在寻找在Hadoop中处理大规模遥感图像的解决方案。直到现在我什么都没有

这是一个开源项目,关于在Hadoop中将大型映像拆分为小型映像。我已经仔细阅读了代码并进行了测试。但是我发现他们的表现不如预期的好。无论如何,这可能会有所帮助,并对这个问题有一些启示

马祖计划:


祝你好运

我想你可以看看《Hadoop:权威指南》第三版中的例子。附录C概述了在bash中获取文件(在hdfs中)的方法,解压文件,创建文件夹,从解压文件夹中的文件创建新文件,然后将该文件放到另一个hdfs位置

我自己定制了这个脚本,因此最初的hadoop get是对承载我需要的输入文件的Web服务器的curl调用——我不想将所有文件都放在hdfs中。如果您的文件已经在hdfs中,那么您可以使用注释掉的行。hdfs get或curl将确保该文件在本地可用于该任务。这里面有很多网络开销

没有必要执行reduce任务

输入文件是指向要转换/下载的文件的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。听起来他们采取了类似的方法:。他们使用了JavaAPI,但剩下的就是在本地获取文件,处理它,然后将其粘贴回hdfs/sc3

所以你是说Hadoop for images主要用于超大规模的图像,而不是超大数量的图像???@aaaaaaa一点也不。我认为Hadoop可以用于图像处理,但他的要求并不适合Hadoop。但是你是对的,少量的大尺寸图像比大量的小图像要好,尽管你可以忽略
CombineInputFormat
的许多问题,但仍然需要大量的开销。这实际上是一个只包含链接的答案;这样的回答是不可取的。