0

私は Apache Hadoop 0.2.x バージョンでいくつかの MapReduce プログラムを作成しました。簡単に言えば、私は初心者です。

SeismicUnixというソフトウェアを使用して、Linux マシンで大きな (10GB 以上の) SegYファイルを処理しようとしています。

Linux マシンで実行する基本的なコマンドは次のとおりです。

//Read SegY file and convert to custom format (.su file)

segyread tape=input.sgy verbose=1 endian=0 | segyclean >input.su


//PIPE-SEPARATE the processing commands viz. suhilb and suaccor
suhilb | suaccor ntout=1001 sym=0 < Noise1_10.su > output.su


//Create headers for converting back to SegY format
segyhdrs < output.su bfile=binary hfile=header


//Create the final output file in SegY format
segywrite <output.su tape=output.segy buff=1 conv=1 bfile=binary hfile=header

これらの手順は 1 台のマシンでは時間がかかるため、高速化のために Apache Hadoop クラスターがセットアップされています。

私の思考プロセスによると:

  1. ソース SegY ファイルをクラスターに分割します (大きなファイルの小さなチャンクをすべてのノードで処理できるようにします)。
  2. おそらく、Hadoop ストリーミングを使用して、SeismicUnix コマンドを呼び出して、すべてのノードで小さなチャンクを処理します
  3. 処理されたファイルを、出力となる 1 つの大きな SegY ファイルに集約します。

技術的な質問/課題:

  1. ソース SegY ファイルは、処理のためにさまざまなノードで使用できるようになる前に、最初に HDFS にロードする必要があります。これを行うにはどうすればよいですか - SequenceFile などを作成しますか? SeismicUnix は SegY ファイルを読み取り、カスタム形式に変換してから処理します。
  2. 2 番目のコマンドに示すように、さまざまな操作 (コマンド) は、実行したい順序でパイプ処理されます。スーアコー。さて、これは 1 つのマッパーで発生するのでしょうか、それとも suhilb 用に 1 つのマッパーを作成し、その出力を suaccor にフィードする必要がありますか? ここでは非常に混乱しています。
  3. 処理が完了し、各ノードが output.segy で作成されたと仮定すると (この仮定は正しいですか?)、これらのファイルをマージするにはどうすればよいですか (ここではまったく無知です)。

Google の FlumeJava が解決策と考えていることについて少し読みましたが、Hadoop のみに固執したいと思います。つまり、今のところライブラリのアプローチはありません。

クエリを詳細に/簡潔に尋ねていない場合はお詫びします-実際には、デザイン/コードの明確なアイデアを得ることができません!

4

1 に答える 1

0

あなたの質問に対応するポイントで答えて、

  1. ソフトウェアが SegY ファイルを変換するために使用するカスタム形式がわかっている場合はHDFS、同じ形式を使用してファイルを保存できます。読み込むにHDFSは、Sqoop などのオープン ソース ツールを調べる必要があります。

  2. マッパーを使用して、さまざまな操作を順番に実行できます。したがって、異なるマッパーは、入力の異なるチャンクに対して並行して操作を実行します。

  3. output.segy出力ファイルをマージするには、キーに基づいてソートするリデューサーを使用してみてください。使用するサンプル キーは、ファイルの名前にすることができます。したがって、さまざまな出力ファイルのすべてのデータが 1 つのレデューサーにルーティングされ、1 つの出力部分 -r - 000 ファイルが生成されます。

于 2013-01-15T10:18:26.073 に答える