-1

私は約100TBのデータを持っており、各データ(要素)のサイズは約1MBです。また、データから抽出されたM個の要素で構成されるN個の領域があります。すべての要素は最大3つの領域に表示されます。領域内のM要素は、MxM相関行列に相互相関する必要があります。Mの平均サイズは正確にはわかりませんが、5から数百まで変化する可能性があります。

現在の実装では、スレッドを生成して各リージョンを処理し、NFSを介してファイルを読み取ることで個々の要素をフェッチします。このソリューションはI/Oバウンドであることが判明し、現在、データと計算を一緒に分散する方法を検討しています。一見すると、MapReduceはこの問題に適しているように見えますが、私はこのパラダイムに精通していないため、確実に知ることはできません。

Hadoopを使用したとしましょう。私が最初に考えたのは、データをチャンクとしてHDFSに取り込み、各チャンクを可能な限り同じ領域の要素で構成することです。次に、各マップタスクに一連の要素と放出(領域、要素)のペアが与えられます。次に、各Reduceタスクは、領域のすべての要素を取得し、相互相関を実行します。しかしもちろん、この直感的でおそらく素朴なアプローチがMapReduceの合理的な使用法であるかどうかはわかりません。

一つには、ここでのデータ/計算の局所性についてはよくわかりません。一般に、マップタスクによって処理されているデータは、同じノードにある可能性が高いと思います。しかし、それはReduceタスクにも当てはまりますか?

たとえば、マップタスクからファイル内のある場所を指す値を出力した場合、Reduceタスクが同じノードで実行されている可能性は高いですか?マップフェーズでデータをメモリに読み込んでから、1MBの要素をシリアル化された形式で出力する方がよいでしょうか。100 TBのデータすべてがRAMに保存されたり、中間ファイルにコピーされたりすることはありませんか?

それで、これはMapReduceの良い候補ですか、それとも他の場所で解決策を探す必要がありますか?これはMapReduceにとっては良い問題ですが、解決策としては不十分ですか?洞察を事前に感謝します。

4

1 に答える 1

0

私には、あなたが不必要にレデューサーを追加しようとしているように聞こえます。Nが十分に大きいと仮定して、次のことを試してみます。各領域(データセット全体の1 / N)をマッパーに挿入し、そこで相互相関行列を計算します。ここでのレデューサーは実際には必要ないので、完全に無視して、マップフェーズの結果をまっすぐに書くことができます。MapReduceでは、通常、手間のかかる作業はマップフェーズで行われます。この場合、M個の相互相関行列のみを探しているのであれば、レデューサーは実際には必要ないようです。

一般に、マップタスクによって処理されているデータは、同じノードにある可能性が高いと思います。しかし、それはReduceタスクにも当てはまりますか?

一般に、reduceタスクでは、データ(つまり、マップタスクの結果)を操作する前に、データ(つまり、マップタスクの結果)をタスクに転送する必要があります。ネットワークトラフィックを最小限に抑えるために、データをレデューサーに渡す前に、データを可能な限り圧縮することをお勧めします。

于 2012-12-02T06:15:57.653 に答える