直径が大きい場合がある (最大のコンポーネントが 1m に達することもある) グラフで接続コンポーネントを見つけるための単純なアルゴリズムを探しました。
非常に洗練された MR アルゴリズムが多数見つかりました。
- http://codingwiththomas.blogspot.de/2011/04/graph-exploration-with-hadoop-mapreduce.html
- http://blog.piccolboni.info/2010/07/map-reduce-algorithm-for-connected.html
- http://chasebradford.wordpress.com/2010/10/23/mapreduce-implementation-for-union-find/
非常に単純なアルゴリズムの何が問題なのか:
- foreach コンポーネントで、node として flatten(nodes_bag) を生成し、comp_id として node_with_the_smallest_id を生成します。
- ノードごとにグループ化
- 複数の comp_id を持つノードをフィルタリングし、「大きな comp_id を小さな comp_id に更新」テーブルを構築します。
- 大きな comp_id を持つすべてのノードを、対応する新しい小さな comp_id に更新し、ダーティとしてマークします。
これらの汚れたノードを使用して次の反復に進みます...ここで何が欠けているのでしょうか?