私は現在、論文を読んでいますが、ライターたちは、すべてのマップタスクのメモリにいくつかの配列があり、マップタスクが終了すると、その配列を出力すると言っています。Hadoop:マップ関数のメモリ構造を持ち、それらを集約することは可能ですか?
この私が参照していた紙さ:http://research.google.com/pubs/pub36296.html
これはやや行うにはビット非のMapReduceのものに見えるが、私はこのプロジェクトを実装しようとしていると私がポイントになってきたが、これはあるし、唯一の解決策です。私は共通のマップを使用する多くの方法を試しています。これは、各行を処理し、キーと値のペアを出力しますが、そのようにして、私は入力のあらゆる行に対して、何千ものコンテキスト書き込みを行い、それら。だから私の地図の仕事はボトルネックです。これらのコンテキスト書き込みはコストがかかる。
もし私がそれを行うなら、私はキーと値のペアの数を劇的に減らすことができます。だから私はすべてのマップタスクのメモリ構造を持つ方法を見つける必要があります。 私はこれらの構造をセットアップ機能で静的なものとして定義できますが、マップタスクが終了したときにその構造を出力できるようにする方法を見つけることができます。私はちょっと変わったと思っていますが、効率的に働く唯一の方法です。
これは起動時に、彼らはその紙に言う
で、各マッパーは それぞれ注文した属性のために考慮すべき分割点の集合をロードします。各ノードn∈N と属性Xについて、マッパーはキーのテーブルTn、Xを保持します。 値のペア。
:、 プットフォームのキーN、Xおよび値v OUT-マッパーをすべての入力データを処理した後、Tnは、X [V]ここで
は、いくつかの編集はショーンの答えの後にあります
私は自分の仕事でコンバイナーを使用しています。実際には、マップ関数内のこれらのcontext.write(Text、Text)コマンドは本当に時間がかかります。私の入力はcsvファイルまたはarffファイルです。すべての行に例があります。私の例には、何千もの属性があるかもしれません。私はすべての属性のために、<(n、X、u)、Y>の形のキーと値のペアを出力しています。ここで、はノードの名前(私は決定木を構築しています)、Xは属性の名前、 uは属性の値、Yはテキスト形式の統計値です。私が100,000の属性を持っているなら、すべての例について100,000のcontext.write(Text、Text)コマンドを持つ必要があります。これらのコマンドを使わずにマップタスクを実行すると、風のように動作します。私はcontext.writeコマンドを追加すると、それは永遠にかかる。 2,000,000の属性トレーニングセットでさえも。私は実際にファイルで書いているのであって、記憶ではないようです。だから私は本当にそれらの書き込みを減らす必要があります。それらをメモリに集約する必要があります(マップ関数ではなくコンバイナで)。
はい、これは私が欲しいものです。集約してレデューサーに出力する(そして、コンバイナーを持つかもしれない)。閉じることは良い解決策のようです。そして、静的変数を持つことによっていくつかの問題を引き起こす可能性があります。それを指摘してくれてありがとう。だから、私はclose(私はちょうどそれがクリーンアップと呼ばれることを確認した)の中でcontext.writeのようなことをしようとします。それがうまくいくかどうか私はあなたに知らせます。私はちょっとしたテキスト変数を書こうとしましたが、もっと速くなりました。両方のお返事ありがとう。彼らはもっと役に立たなかった。 – jojoba
私はそれをしました。これは完全に紙がそれを記述する方法です。それはずっと速くなります。私はまだ私のコードを少し最適化する必要があり、それはうまくいくでしょう。あなたの提案に感謝します。 – jojoba