Spark GraphX で始めるグラフ解析

17
Spark GraphX ででででででででで ででで Geek Night#11 Lightning Talk 2016-12-21 @mogproject

Transcript of Spark GraphX で始めるグラフ解析

Page 1: Spark GraphX で始めるグラフ解析

Spark GraphXで始めるグラフ解析市ヶ谷 Geek★Night#11 Lightning Talk

2016-12-21 @mogproject

Page 2: Spark GraphX で始めるグラフ解析

About me

http://mogproject.com

Page 3: Spark GraphX で始めるグラフ解析

Spark GraphX

Apache Spark GraphX とは▸ Spark に標準で組み込まれているグラフ処理 API▸ Spark クラスタ = データストア / 計算資源▸ 大規模グラフを扱いやすい

Page 4: Spark GraphX で始めるグラフ解析

Spark GraphX

今回お話しする「グラフ」は・・・

Page 5: Spark GraphX で始めるグラフ解析

Why GraphX?

実用例▸ 大規模グラフの分析プロジェクト ( 論文の共著者関係分析 )

▸ ノード数 : 500 万〜 エッジ数 : 9000 万〜▸ 最初は Python 製 の NetworkX を使っていた

▸ グラフが大きくなるにつれ、メモリ不足が発生▸ Scala / Spark に慣れているなら手軽に利用可能

Page 6: Spark GraphX で始めるグラフ解析

Why GraphX?

実用例 : ( 無向 ) グラフの中心性計算▸ 次数中心性

▸ 次数 = 各ノードに接続しているエッジの数▸ 直接的なつながりの多いノードを発見できる

▸ 媒介中心性▸ 全てのノードの組に対して最短経路を求める▸ より多くの組の最短経路上に位置するノードを計算

Page 7: Spark GraphX で始めるグラフ解析

コード例

build.sbt▸ "spark-graphx" への依存を追加▸ Scala 2.12 には未対応scalaVersion := "2.11.8"

libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "2.0.2", "org.apache.spark" %% "spark-graphx" % "2.0.2")

build.sbt

Page 8: Spark GraphX で始めるグラフ解析

コード例

グラフデータの読み込み▸ エッジリストからグラフを生成する例

0 10 21 21 33 44 54 65 6

edge_list_1.txt

Page 9: Spark GraphX で始めるグラフ解析

コード例

グラフデータの読み込み▸ GraphLoader のメソッドを利用するimport org.apache.spark._import org.apache.spark.graphx._

val conf = new SparkConf().setMaster(s"local[2]")val sc = new SparkContext(conf)

val g: Graph[Int, Int] = GraphLoader.edgeListFile(sc, "path/to/edge_list.txt")

Main.scala

Page 10: Spark GraphX で始めるグラフ解析

コード例

次数中心性の計算▸ Graph#degrees を呼び出すだけg.degrees.sortByKey().collect().foreach { case (n, v) => println(s"Node: ${n} -> Degree: ${v}")}

Node: 0 -> Degree: 2Node: 1 -> Degree: 3Node: 2 -> Degree: 2Node: 3 -> Degree: 2Node: 4 -> Degree: 3Node: 5 -> Degree: 2Node: 6 -> Degree: 2

Main.scala

出力例

Page 11: Spark GraphX で始めるグラフ解析

コード例

次数中心性の計算

32

32

22

2

Page 12: Spark GraphX で始めるグラフ解析

コード例

媒介中心性の計算▸ なかなか大変 ( 説明省略 )

Page 13: Spark GraphX で始めるグラフ解析

コード例

媒介中心性の計算▸ 実行結果Node: 0 -> Betweenness: 0.0Node: 1 -> Betweenness: 8.0Node: 2 -> Betweenness: 0.0Node: 3 -> Betweenness: 9.0Node: 4 -> Betweenness: 8.0Node: 5 -> Betweenness: 0.0Node: 6 -> Betweenness: 0.0

出力例

Page 14: Spark GraphX で始めるグラフ解析

コード例

媒介中心性の計算

80

80

90

0

Page 15: Spark GraphX で始めるグラフ解析

後日談

性能面の課題▸ グラフ操作の種類 ( アルゴリズム ) によって得手不得手がある▸ Spark ノード間の通信コスト▸ Spark の UI でモニタリングしつつチューニングを繰り返す

Page 16: Spark GraphX で始めるグラフ解析

後日談

C++ で実装し直した▸ とある処理の所要時間 : 854 日 (GraphX) -> 15 日 (C++)

60 倍 高速化 !

Page 17: Spark GraphX で始めるグラフ解析

Thanks!

ご清聴ありがとうございました

▸ コード例はこちら▸ https://github.com/mogproject/example-graphx

クリスマスに働く人のイラスト © いらすとや