0

私はHadoopを初めて使用し、次のことを行う方法を見つけようとしています。

  1. 複数の入力画像ファイルがあります。
  2. これらのファイルを処理するバイナリ実行可能ファイルがあります。
  3. これらのバイナリ実行可能ファイルは、出力としてテキストファイルを書き込みます。
  4. これらの実行可能ファイルをすべて含むフォルダーがあります。
  5. これらの実行可能ファイルをすべて特定の順序で実行し、画像の場所を引数として渡すスクリプトがあります。

私の質問はこれです:Hadoopストリーミングを使用して、これらのバイナリを介してこれらの画像を処理し、テキストファイルから結果を吐き出すことができますか?

私は現在これを試しています。

Hadoopクラスターを実行しています。バイナリと画像をHDFSにアップロードしました。

Hadoopを実行すると、ディレクトリを画像のあるフォルダに変更し、バイナリを実行する別のスクリプトを実行するスクリプトを設定しました。

次に、結果のstdoutを介してスクリプトが吐き出されます。

ただし、マップスクリプトをHDFSのイメージフォルダーに変更してから、他のスクリプトを実行する方法がわかりません。

誰かが私にヒントを与えることができますか?

    sudo ./hadoop/bin/hadoop jar ../hduser/hadoop/contrib/streaming/hadoop-streaming-1.1.0.jar \
-numReduceTasks 0 \
-file /home/hduser/RunHadoopJob.sh \
-input  /user/hduser/7posLarge \
-output /user/hduser/output5 \
-mapper RunHadoopJob.sh  \
-verbose

そして私のRunHadoopJob.sh:

#!/bin/bash
cd /user/hduser/7posLarge/;
/user/hduser/RunSFM/RunSFM.sh;

私のHDFSは次のようになります。

hadoop fs -ls
Warning: $HADOOP_HOME is deprecated.

Found 4 items
drwxr-xr-x   - hduser supergroup          0 2012-11-28 17:32 /user/hduser/7posLarge
drwxr-xr-x   - hduser supergroup          0 2012-11-28 17:39 /user/hduser/RunSFM
drwxr-xr-x   - root   supergroup          0 2012-11-30 14:32 /user/hduser/output5

私はこれがMapReduceの標準的な使用法ではないことを知っています。オーバーヘッドをあまり書かずに、同じプログラムの異なるクラスターで異なる入力を使用して複数のジョブをスピンアップすることなく、簡単に実行できる方法を探しています。これは、 Hadoopストリーミングのドキュメントを見ると可能であるようです。

「Hadoopストリーミングを使用して、(半)独立したタスクの任意のセットを実行するにはどうすればよいですか?

多くの場合、Map Reduceの全機能は必要ありませんが、同じプログラムの複数のインスタンスを実行する必要があるだけです。データの異なる部分、または同じデータで、異なるパラメーターを使用します。これを行うには、Hadoopストリーミングを使用できます。「」

これが不可能な場合、たとえばAmazonAWSにこれを実行できる別のツールはありますか?

更新: 同様の解決策があるように見えますが、私はそれらをフォローするのに問題があります。彼らはここここにいます。

4

2 に答える 2

0

Hadoopストリーミングおよびバイナリファイルを処理する場合、いくつかの問題があります。

  • Hadoopは画像ファイルの処理方法を知りません
  • マッパーはstdinから1行ずつ入力を取得するため、stdinから一時的に画像データを書き込む中間シェルスクリプトを作成する必要があります。その後、実行可能ファイルに渡されるファイル。

ディレクトリの場所を実行可能ファイルに渡すだけでは、データの局所性が失われるため、実際には効率的ではありません。このトピックに関してすでによく回答されている質問を繰り返したくないので、ここにリンクがあります:
画像処理のためのAmazon MapReduce / Hadoopの使用
Hadoop:map / reduceによって処理される(多くの)写真画像にアクセスする方法は?

別のアプローチは、画像ファイルを分割可能に変換することですSequenceFiles。つまり、各レコードは、SequenceFile内の1つの画像になります。次に、これを入力形式として使用して、マッパーは取得した各レコードの実行可能ファイルを呼び出します。TaskTrackerJavaコードから実行できるように、事前に正しいファイル権限をノードに提供する必要があることに注意してください。
このトピックに関する詳細情報:
Hadoop:map/reduceで処理される画像バイナリを含むSequenceFileを生成するプロセスの例

于 2012-12-01T22:27:02.937 に答える
0

「ハック」を使用して、回避策のプロトタイプを作成することができました。

私はまだこれを試していますが、クラスターのOSアーキテクチャに応じてバイナリを再コンパイルする必要があるため、エラスティッククラスターでは機能しないと思います。ただし、プライベートクラスターがある場合は、これが解決策になる可能性があります。

Hadoopストリーミングを使用すると、バイナリを.jarファイルにパッケージ化してノードに送信できます。ノードでは、スクリプトが実行される前にバイナリが解凍されます。

pics.jarに画像があり、BinaryProgramFolder.jarでプログラムを開始したディレクトリにあるすべての画像を処理するプログラムがあります。フォルダ内には、プログラムを起動するスクリプトがあります。

私のストリーミングジョブは、画像とバイナリプログラム+スクリプトをノードに送信し、それらを開始します。繰り返しますが、これは回避策のハックです...問題の「実際の」解決策ではありません。

それで、

sudo ./hadoop/bin/hadoop jar ../hduser/hadoop/contrib/streaming/hadoop-streaming-1.1.0.jar \
    -archives 'hdfs://master:54310/user/hduser/pics.jar#pics','hdfs://master:54310/user/hduser/BinaryProgramFolder.jar#BinaryProgramFolder' \
    -numReduceTasks 0 \
    -file /home/hduser/RunHadoopJob.sh \
    -input  /user/hduser/input.txt \
    -output /user/hduser/output \
    -mapper RunHadoopJob.sh  \
    -verbose

フィラー入力ファイルtext.txt:

Filler text for streaming job.

RunHadoopJob.sh

cp -Hr BinaryProgramFolder ./pics; #copy a sym link to your unpacked program folder into your pics directory.
cd ./pics;
./BinaryProgramFolder/BinaryProgramLauncScript.sh <params>; #lunch your program following the symlink to the programs folder, I also used a script to launch my bin program which was in the same folder as the launch script.

注:最初にプログラムと画像をjarアーカイブに入れてから、HDFSにコピーする必要があります。使用するhadoop fs -copyFromLocal ./<file location> ./<hadoop fs location>

于 2012-12-11T07:41:19.520 に答える