Использование Amazon MapReduce / Hadoop для обработки изображений - PullRequest
4 голосов
/ 19 октября 2011

У меня есть проект, который требует от меня обработки большого количества (от 1000 до 10000) больших (от 100 до 500 МБ) изображений. Обработку, которую я делаю, можно выполнить с помощью Imagemagick, но я надеялся, что на самом деле эта обработка будет выполняться на платформе Amazon Elastic MapReduce (которая, я считаю, работает с использованием Hadoop).

Из всех примеров, которые я нашел, все они имеют дело с текстовыми входами (я обнаружил, что Word Count производит выборку миллиард раз). Я не могу найти ничего о такой работе с Hadoop: начиная с набора файлов, выполняя одно и то же действие для каждого из файлов, а затем записывая вывод нового файла как его собственный файл.

Я почти уверен, что это можно сделать с помощью этой платформы, и должно быть в состоянии сделать это с помощью Bash; Я не думаю, что мне нужно заниматься созданием целого Java-приложения или чего-то такого, но я могу ошибаться.

Я не прошу, чтобы кто-нибудь передал мне код, но если у кого-то есть пример кода или ссылки на учебные пособия, посвященные аналогичным вопросам, было бы очень признательно ...

Ответы [ 4 ]

9 голосов
/ 19 октября 2011

Есть несколько проблем с вашей задачей.

Hadoop не обрабатывает изображения, как вы видели. Но вы можете экспортировать все имена файлов и пути в виде текстового файла и вызвать для него некоторую функцию Map. Поэтому вызывать ImageMagick для файлов на локальном диске не стоит.

Но как вы справляетесь с локальностью данных?

Нельзя запускать ImageMagick для файлов в HDFS (нестабильно только 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

4 голосов
/ 11 декабря 2012

Я думаю, вы могли бы посмотреть на пример в "Hadoop: The Definitive Guide", 3-е издание. В приложении C в bash описан способ получить файл (в формате hdf), разархивировать его, создать папку, создать новый файл из этих файлов в разархивированной папке и затем поместить этот файл в другое место в формате hdf.

Я сам настроил этот сценарий так, чтобы начальным getadoop было вызов curl веб-серверу, на котором размещены нужные мне входные файлы - я не хотел помещать все файлы в hdfs. Если ваши файлы уже находятся в формате hdf, вы можете использовать закомментированную строку. 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

New York Times обработала 4 ТБ необработанных данных изображений в pdf за 24 часа с помощью Hadoop. Похоже, что они применили похожий подход: 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.

0 голосов
/ 23 февраля 2012

Я давно искал решения для работы с крупномасштабными изображениями дистанционного зондирования в Hadoop. И я ничего не получил до сих пор!

Вот проект с открытым исходным кодом о разделении крупномасштабного изображения на более простые в Hadoop. Я внимательно прочитал код и проверил их. Но я обнаружил, что выступления не так хороши, как ожидалось. В любом случае, это может быть полезно и пролить свет на проблему.

Проект Мацу: http://www.cloudbook.net/directories/research-clouds/research-project.php?id=100057

Удачи!

0 голосов
/ 19 октября 2011

Вы можете взглянуть на CombineFileInputFormat в Hadoop, который может неявно объединять несколько файлов и разбивать их на основе файлов.

Но я не уверен, как вы собираетесь обрабатывать изображения 100M-500Mтак как он довольно большой и на самом деле больше, чем размер сплит Hadoop.Может быть, вы можете попробовать разные подходы для разделения одного изображения на несколько частей.

В любом случае, удачи.

...