私は 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 クラスターがセットアップされています。
私の思考プロセスによると:
- ソース SegY ファイルをクラスターに分割します (大きなファイルの小さなチャンクをすべてのノードで処理できるようにします)。
- おそらく、Hadoop ストリーミングを使用して、SeismicUnix コマンドを呼び出して、すべてのノードで小さなチャンクを処理します
- 処理されたファイルを、出力となる 1 つの大きな SegY ファイルに集約します。
技術的な質問/課題:
- ソース SegY ファイルは、処理のためにさまざまなノードで使用できるようになる前に、最初に HDFS にロードする必要があります。これを行うにはどうすればよいですか - SequenceFile などを作成しますか? SeismicUnix は SegY ファイルを読み取り、カスタム形式に変換してから処理します。
- 2 番目のコマンドに示すように、さまざまな操作 (コマンド) は、実行したい順序でパイプ処理されます。スーアコー。さて、これは 1 つのマッパーで発生するのでしょうか、それとも suhilb 用に 1 つのマッパーを作成し、その出力を suaccor にフィードする必要がありますか? ここでは非常に混乱しています。
- 処理が完了し、各ノードが output.segy で作成されたと仮定すると (この仮定は正しいですか?)、これらのファイルをマージするにはどうすればよいですか (ここではまったく無知です)。
Google の FlumeJava が解決策と考えていることについて少し読みましたが、Hadoop のみに固執したいと思います。つまり、今のところライブラリのアプローチはありません。
クエリを詳細に/簡潔に尋ねていない場合はお詫びします-実際には、デザイン/コードの明確なアイデアを得ることができません!