-1

私はhadoopが初めてです。基本的に私は 3 GB 以上の 2 つの multifasta ファイル (ref.fasta、query.fasta) を取るプログラムを書いています.....

ref.fasta:

gi|12345 アタタタガガカカアタアアアアアアアアアアアアアアアアアアアアアアアア。

gi|5253623 AATTATCGCAGCATTA...

..等々..

クエリ.fasta:

クエリ ATTATTTAAAATCTCACACCACATAATCAATACA AATCCCCACCACAGCACACGTGATATATATACA CAGACACA...

各マッパーに、ref ファイルの 1 つの部分とクエリ ファイル全体を渡す必要があります。すなわち

gi|12345 ATATTATAGGACACCAATA.... (ref ファイルからの単一の fasta シーケンス)

ANDクエリファイル全体。これらの両方を入力として受け取るマッパー内でexeを実行したいためです。

ref.fasta を外部で処理してからマッパーに渡しますか?または他の何か..?? 最小限の時間がかかるアプローチが必要です。

ありがとう。

4

2 に答える 2

0

同様の問題に直面しました。

ref ファイルを前処理し、複数のファイル (シーケンスごとに 1 つ) に分割することをお勧めします。次に、これらのファイルを hdfs のフォルダーにコピーします。このフォルダーは、メイン メソッドで入力パスとして設定します。次に、カスタム入力形式クラスとカスタム レコード リーダー クラスを実装します。レコード リーダーは、ローカル ファイル分割パスの名前を (テキスト値として) マップ メソッドのキーまたは値パラメーターに渡すだけです。

すべてのマップ関数で必要なクエリ ファイルについては、再度クエリ ファイルを hdfs に追加してから、main メソッドの DistributedCache に追加します。map メソッドでは、両方のローカル ファイル パスにアクセスし、それらを exe に渡すことができます。

それが役立つことを願っています。

同様の問題があり、最終的にブラスト exe ファイルの機能を再実装して、map メソッドでファイルの読み取りを処理する必要がなくなり、代わりに、カスタム レコード リーダーでファイルを入力し、マップ関数にオブジェクトとして渡します。

乾杯、ウェイン。

于 2013-02-15T12:39:09.863 に答える
0

ユースケースに最適な方法は、クエリ ファイルを分散キャッシュに格納し、ファイル オブジェクトをconfigure()/setup()で使用できるようにすることmap()です。そして、通常の入力としてrefファイルを持っています。

次の操作を実行できます。

run()クエリ ファイルを分散キャッシュに追加します。

DistributedCache.addCacheFile(new URI(queryFile-HDFS-Or-S3-Path), conf);

マッパークラスを次のようにします。

public static class MapJob extends MapReduceBase implement Mapper { File queryFile;

    @Override
    public void configure(JobConf job) {

        Path queryFilePath = DistributedCache.getLocalCacheFiles(job)[0];
                    queryFile = new File(queryFilePath.toString());
            }

            @Override
    public void map(LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter)
            throws IOException {
            // Use the queryFile object and [key,value] from your ref file here to run the exe file as desired.
            }
}
于 2013-02-15T22:01:25.933 に答える