4

大きな(100MB〜500MB)画像をたくさん(1000-10000)処理する必要があるプロジェクトがあります。私が行っている処理はImagemagickで行うことができますが、AmazonのElastic MapReduceプラットフォーム(これはHadoopを使用していると思われます)で実際にこの処理を行うことを望んでいました。画像処理にAmazon MapReduce/Hadoopを使用する

私が見つけたすべての例の中で、それらはすべてテキストベースの入力を扱っています(私はWord Count Countが数十億回ということがわかりました)。私はHadoopでこの種の作業を見つけることはできません。ファイルのセットから始め、それぞれのファイルに同じアクションを実行してから、新しいファイルの出力を自分のファイルとして書き出します。

これはこのプラットフォームで行うことができ、Bashを使用して行うことができるはずです。私は、Javaアプリケーション全体または何かを作成するという手間を要するとは思わないが、間違っている可能性がある。

あなたはCombineFileInputFormatを見てみることができます私は私のコードを手に誰かのために求めていないんだけど、誰もがサンプルコードまたは同様の問題に対処するチュートリアルへのリンクを持っている場合、それははるかに...

答えて

9

タスクにはいくつかの問題があります。

あなたが見たようにHadoopはイメージをネイティブに処理しません。しかし、すべてのファイル名とパスをテキストファイルとしてエクスポートし、そこにあるMap関数を呼び出すことができます。そのため、ローカルディスク上のファイルに対してImageMagickを呼び出すことは大したことではありません。

ただし、データの地域性をどのように扱いますか?

ImageMagickをHDFSのファイルで実行することはできません(Java APIとFUSEマウントは安定していません)、タスクスケジューリングを予測することはできません。たとえば、画像が存在しないホストにマップタスクをスケジュールすることができます。

確かに、ただ1台のマシンと1つのタスクを使用できます。しかし、あなたは改善がありません。あなたはそれからちょうどのオーバーヘッドを持つでしょう。

また、Javaタスクからシェルするときにメモリの問題があります。私はそれについてブログの投稿をした[1]。

and should be able to be done using Bash 

これは次の問題です。マップタスクを少なくとも作成する必要があります。 ImageMagickを特定のパスと関数で呼び出すには、ProcessBuilderが必要です。それは自分のファイルのように、新しいファイルの出力を書き出すそして、それぞれのファイルに を同じアクションを実行すると、ファイルのセットで を開始:

私はHadoopのと、この種の仕事については何も見つけることができません。

なぜでしょうか? :D Hadoopはこの作業には適切ではありません。

基本的に、イメージを複数のホストに手動で分割し、その上にbashスクリプトを実行することをお勧めします。 ストレスが少なく、速いです。同じホスト上で並列化するには、コアごとに複数のフォルダにファイルを分割し、その上にbashスクリプトを実行します。これはあなたのマシンをかなりうまく利用し、Hadoopよりも優れているはずです。

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

+0

画像のためのHadoopは主に、ginormous-size-of-imagesではなく、ginormous-sized画像用です。 –

+0

@aaaaaaaまったくありません。私はHadoopを画像処理に使うことができると思っていますが、彼の要件はHadoopには適していません。しかし、大丈夫です、小さなサイズの画像は、大量の小さな画像よりも優れていますが、あなたは 'CombineInputFormat'の多くの問題を無視することができます。 –

0

をいただければ幸いですHadoopでは複数のファイルを暗黙的に結合し、ファイルに基づいて分割することができます。

しかし、私は100M-500Mイメージをどのように処理するのかは分かりません。実際には大きく、実際にはHadoopの分割サイズよりも大きいためです。たぶんあなたは、1つのイメージを複数の部分に分割する際に、さまざまなアプローチを試みることができます。

とにかく、幸運。

0

を私は長い時間のためのHadoopでの大規模なリモートセンシング画像に対処するためのソリューションを探してきました。そして、私は今まで何も得ていません!

大規模なイメージをHadoopのsamllerイメージに分割するためのオープンソースプロジェクトです。コードを慎重に読んでテストしました。しかし、私はパフォーマンスが期待どおりではないことがわかった。とにかく、それは助けになるかもしれませんし、問題にいくつかの光を当てるかもしれません。

プロジェクト松: http://www.cloudbook.net/directories/research-clouds/research-project.php?id=100057

幸運!

+0

これは実質的にリンクオンリーの回答です。そのような答えはお勧めできません。 – dmckee

4

「Hadoop:The Definitive Guide」第3版の例を見ることができると思います。付録Cでは、ファイルを(hdfsで)入手し、解凍し、フォルダを作成し、解凍されたフォルダ内のそれらのファイルから新しいファイルを作成し、そのファイルを別のhdfsの場所に配置する方法を説明します。

私はこのスクリプトを自分でカスタマイズしています。最初のhadoop getは、必要な入力ファイルをホストしている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を使用して4TBの生画像データをpdfsに24時間処理しました。彼らは同様のアプローチを取ったようです: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に戻します。