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

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

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

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

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


person jzimmerman2011    schedule 19.10.2011    source источник


Ответы (4)


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

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

person Thomas Jungblut    schedule 19.10.2011
comment
Итак, вы говорите, что Hadoop для изображений предназначен в основном для изображений огромных размеров, а не для огромного количества изображений ?? - person ; 04.09.2012
comment
@ааааааа совсем нет. Я думаю, что Hadoop можно использовать для обработки изображений, но его требования не подходят для Hadoop. Но да, вы правы, небольшое количество изображений больших размеров лучше, чем большое количество маленьких изображений, хотя вы можете пренебречь многими проблемами с CombineInputFormat, все еще связаны значительные накладные расходы. - person Thomas Jungblut; 04.09.2012

Я думаю, вы могли бы посмотреть на пример в «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

The 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.

person Steven Lohrenz    schedule 10.12.2012

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

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

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

person Hugo Liu    schedule 19.10.2011

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

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

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

Удачи!

person fancy    schedule 23.02.2012
comment
Фактически это ответ только по ссылке; такие ответы не приветствуются. - person dmckee --- ex-moderator kitten; 27.10.2012