私は約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にとっては良い問題ですが、解決策としては不十分ですか?洞察を事前に感謝します。