GiraphはGithubからソースコードをダウンロードできます。
GiraphにはSSSP問題のサンプルコード「src/main/java/org/apache/giraph/examples/SimpleShortestPathsVertex.java」が付属します。以下、コードの本質部分(BSPのsuperstepにおけるConcurrent Computation処理)を抜粋します(GiraphのWikiも参照ください)。
このように、GiraphでSSSP問題を解決するための実装コードは、非常に簡単です。
GiraphはPregelの実装なので、SSSP問題を解決するには「compute()」処理に十数行のコードを記述するだけで行えます。このcompute()処理は、「org.apache.hadoop.mapred.MapTask#run」の中で繰り返し実行され、以下のような特徴を持ちます。
このため、MapReduceでの単純な解決方法と比較しますと、その欠点がすべて解決され、大規模なグラフ問題も効率的に取り扱えることになります。
Giraphに付属のSSSP問題のサンプルコードを稼働させる手順を示します。
まず、「hadoop-1.0.0」の実行間環境を整えて、Hadoopを稼働させます(手順は省略します)。次に、Giraphのソースコードを入手し(ここでは、Subversionを使用)、Mavenを用いてコンパイルします。
svn checkout http://svn.apache.org/repos/asf/incubator/giraph giraph
mvn package
都市のグラフ構造を表すデータは、以下のようなJSON形式で用意します。
JSONArray(<vertex id>, <vertex value>, JSONArray(JSONArray(<dest vertex id>, <edge value>), ...))
この際に都市名は、数値で表現するので、次のようなデータになります(最短時間の<vertex value>の初期値は、ここでは有り得ない最大値として、仮に「10000」を用いています)。
[1,10000,[[2,1],[3,9],[4,6]]]
[2,10000,[[3,1],[4,3]]]
[3,10000,[]]
[4,10000,[[5,2]]]
[5,10000,[]]
このデータをディレクトリ「shortestPathsInputGraph」内のファイルに保存し、HDFSにコピーします。
hadoop dfs -copyFromLocal shortestPathsInputGraph shortestPathsInputGraph
SSSP問題のサンプルSimpleShortestPathsVertexを実行します。
実行結果はディレクトリ「shortestPathsOutputGraph」に出力されるので、その内容を確認します。
hadoop dfs -cat shortestPathsOutputGraph/part-m-00001
次のように、<vertex value>の欄に最短時間が求まった結果が得られます。
[1,0,[[2,1],[3,9],[4,6]]]
[2,1,[[3,1],[4,3]]]
[3,2,[]]
[4,4,[[5,2]]]
[5,6,[]]
本稿では、グラフ問題を効率的に解くためのソリューションとしてHadoop上で稼働するGiraphを紹介しましたが、いかがでしたでしょうか。
グラフ問題は机上レベルでは何も工夫しない単純なMapReduceでも解決できますが、処理効率を考えると、実業務への適応は困難です。グラフ問題を解決するのに、問題の特性にマッチした専用のソリューションGiraphを試してみてはいかがでしょうか。
木村幸敏(きむら ゆきとし)
大規模案件での性能問題にかかわり、アプリのボトルネック特定/解消にかかわる。
また各種FWの適用による生産性向上に取り組む。
TIS先端技術センターでは、採れたての検証成果や知見などをWebサイトで発信中
Copyright © ITmedia, Inc. All Rights Reserved.