分散マトリックス(spark)の種類


sparkの分散マトリックスの種類

分散マトリックスについて、ざっくりまとめたページを探したが見つからなかった。色々見たが公式ドキュメントやReza Zadehさんの発表資料に書いてあることから情報を抽出しておく。あくまでもベースとなるガイドラインなので、細かなニーズについては個別にRDDを使って書くしかない。

3つの分散マトリックス

spark/MLlibには各マシンにどのように分散するかの方式により
- RowMatrix(by rows)
- CoordinateMatrix(by entries)
- BlockMatrix(by blocks)
のように3パターンが用意されている。
それぞれ行、セル、ブロック(セルの塊)での単位で各マシンに保持する。

RowMatrix

基本はRowMatrixで良いが、行番号を意識してインデックス化しておきたい時はIndexedRowMatrixにしておく。後者は他の行列への変換メソッドも実装されているので、プログラムの前半でこの形式で持たせておくことは多いかもしれない。

他とのJoinが必要なことも多く、行番号(ユニークID)が振ってあることも多いはずだ(行番号が特に必要なければ後でRowMatrixに書き換えれば良い)。このクラスは1行を1台のマシンでlocal Vector型で保持するためにカラム数の多い分散マトリックスは苦手。なお、Spark公式ドキュメントにも「分散されたマトリックスの異なる形式への変換はグローバルシャッフルを必要」とあるように気楽に変換していいものではないため数学的に等価でかつ効率のよい計算手順をちゃんと設計すべき。RowMatrixもzipWithIndexをすればインデックスを振れるが行方向の数は大きいことが多く、効率を考えるべき。

CoordinateMatrix

CoordinateMatrixは疎行列専用で使う。行単位ではなくentry毎に分散したい時に使え、大規模でも良い。お馴染みの(i, j, value)の形をしたMatrixEntryのRDDとして実装されている(co-ordinateはi,jでアクセスする座標に似た概念)。
現状は計算をサポートしていないので、ここのような拡張したクラスを作りたくなるのも頷けるが、どうもスケールしない計算処理はこのクラスに安易に入れたくないんだと思う。実際、このクラスに計算処理は実装されずに、新たにBlockMatrixが追加されたのでtoBlockMatrixを呼び出して問題が解決できないか先ずは考えるべき。

BlockMatrix

BlockMatrixはそのものずばりBlock matrix行列という特定の形をした行列に用いる。
行列の性質は
https://www.wikiwand.com/en/Block_matrix
http://mathworld.wolfram.com/BlockMatrix.html
など

ローカルマトリックスと仲良くする

分散型の行列同士だと許されていない操作がある。特に積を計算するときなど、片側をローカルマトリックスに収まるように分割してから計算することが多い。