4

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

私が見つけたすべての例の中で、それらはすべてテキストベースの入力を扱っています (Word Count が 10 億回サンプリングしていることがわかりました)。Hadoop でのこの種の作業については何も見つかりません。一連のファイルから始めて、各ファイルに対して同じアクションを実行し、新しいファイルの出力を独自のファイルとして書き出します。

これはこのプラットフォームで実行できると確信しており、Bash を使用して実行できるはずです。わざわざ Java アプリケーション全体を作成する必要はないと思いますが、間違っている可能性もあります。

誰かにコードを渡してくれるように頼んでいるわけではありませんが、サンプル コードや、同様の問題を扱うチュートリアルへのリンクを持っている人がいれば、大歓迎です...

4

4 に答える 4

9

あなたの仕事にはいくつかの問題があります。

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

しかし、データの局所性をどのように扱うのでしょうか?

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

もちろん、1 台のマシンと 1 つのタスクだけを使用することもできます。しかし、それでは改善はありません。そうすると、たくさんのオーバーヘッドが発生します。

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

and should be able to be done using Bash

それが次の問題です。少なくとも map タスクを作成する必要があります。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: The Definitive Guide」第 3 版の例を見ていただければと思います。付録 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

The New York Times は、Hadoop を使用して 24 時間で 4 TB の生の画像データを PDF に処理しました。同様のアプローチを取っているようです: 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 に貼り付けます。

于 2012-12-10T20:02:15.137 に答える
0

私は長い間、Hadoopで大規模なリモートセンシング画像を処理するためのソリューションを探していました。そして今まで何も手に入らなかった!

これは、Hadoopで大規模な画像をサムラー画像に分割することに関するオープンソースプロジェクトです。私はコードを注意深く読み、テストしました。しかし、パフォーマンスは期待したほど良くないことがわかりました。とにかく、それは役に立つかもしれず、問題にいくらかの光を当てるでしょう。

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

幸運を!

于 2012-02-23T03:06:37.567 に答える
0

ファイルに基づいて、複数のファイルを暗黙的に結合して分割できる、Hadoop の CombineFileInputFormat を見ることができます。

しかし、100M ~ 500M の画像をどのように処理するのかはわかりません。これは非常に大きく、実際には Hadoop の分割サイズよりも大きいためです。1 つの画像を複数の部分に分割するさまざまな方法を試すことができるかもしれません。

とにかく、頑張ってください。

于 2011-10-19T13:26:44.590 に答える