http://i.stanford.edu/~ullman/mmds/ch5.pdfページ 162の回路図に従って、Hadoop でブロック行列ベクトル乗算アルゴリズムを実装しようとしています。私の行列はスパースになり、ベクトルはこれはまさに PageRank でも必要とされるものです。ベクトルはメモリに収まらないと見なされます。
可能な実装について私が考えていた方法は、CompositeInputFormat を使用し、基本的に、マトリックス ブロックとベクトル ブロックのマップ側の結合を実行し、コンバイナー/リデューサーの最終結果ブロックに寄与する中間結果ブロックを合計することです。このアプローチと一般的なマップ側の結合の違いは、行列の複数のブロックをベクトルの 1 つのブロックに結合する必要があることです。分割、順序付けなどに関する Hadoop でのマップ側の結合の要件については知っています。分割に関しては、それに応じて名前を付けたブロックごとに 1 つのファイルを用意することで対応します。私には、どのファイルを結合するかを決定するコードを変更する必要があるように見えるので、Hadoop は 2 つのパスから同じ名前のファイルを結合したくなくなりますが、定義したスキームに従ってください。でも、それが有効なアプローチであるかどうか、コードのこの部分がどこにあるかはわかりません。Hadoop のソースを調べましたが、見つかりませんでした。
reduce-side join を使用してこれを実行できることはわかっていますが、この行列とベクトルの乗算を大量に実行する必要があるため、ここでは効率が重要です。ベクトルがメモリに収まらないため、分散キャッシュは問題外です。
この問題に取り組む方法を知っている人はいますか?