spark graphx で始めるグラフ解析
TRANSCRIPT
![Page 1: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/1.jpg)
Spark GraphXで始めるグラフ解析市ヶ谷 Geek★Night#11 Lightning Talk
2016-12-21 @mogproject
![Page 2: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/2.jpg)
About me
http://mogproject.com
![Page 3: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/3.jpg)
Spark GraphX
Apache Spark GraphX とは▸ Spark に標準で組み込まれているグラフ処理 API▸ Spark クラスタ = データストア / 計算資源▸ 大規模グラフを扱いやすい
![Page 4: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/4.jpg)
Spark GraphX
今回お話しする「グラフ」は・・・
![Page 5: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/5.jpg)
Why GraphX?
実用例▸ 大規模グラフの分析プロジェクト ( 論文の共著者関係分析 )
▸ ノード数 : 500 万〜 エッジ数 : 9000 万〜▸ 最初は Python 製 の NetworkX を使っていた
▸ グラフが大きくなるにつれ、メモリ不足が発生▸ Scala / Spark に慣れているなら手軽に利用可能
![Page 6: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/6.jpg)
Why GraphX?
実用例 : ( 無向 ) グラフの中心性計算▸ 次数中心性
▸ 次数 = 各ノードに接続しているエッジの数▸ 直接的なつながりの多いノードを発見できる
▸ 媒介中心性▸ 全てのノードの組に対して最短経路を求める▸ より多くの組の最短経路上に位置するノードを計算
![Page 7: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/7.jpg)
コード例
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 で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/8.jpg)
コード例
グラフデータの読み込み▸ エッジリストからグラフを生成する例
0 10 21 21 33 44 54 65 6
edge_list_1.txt
![Page 9: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/9.jpg)
コード例
グラフデータの読み込み▸ 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 で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/10.jpg)
コード例
次数中心性の計算▸ 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 で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/11.jpg)
コード例
次数中心性の計算
32
32
22
2
![Page 12: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/12.jpg)
コード例
媒介中心性の計算▸ なかなか大変 ( 説明省略 )
![Page 13: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/13.jpg)
コード例
媒介中心性の計算▸ 実行結果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 で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/14.jpg)
コード例
媒介中心性の計算
80
80
90
0
![Page 15: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/15.jpg)
後日談
性能面の課題▸ グラフ操作の種類 ( アルゴリズム ) によって得手不得手がある▸ Spark ノード間の通信コスト▸ Spark の UI でモニタリングしつつチューニングを繰り返す
![Page 16: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/16.jpg)
後日談
C++ で実装し直した▸ とある処理の所要時間 : 854 日 (GraphX) -> 15 日 (C++)
60 倍 高速化 !
![Page 17: Spark GraphX で始めるグラフ解析](https://reader031.vdocuments.net/reader031/viewer/2022013004/586fd3a51a28ab18428b456d/html5/thumbnails/17.jpg)
Thanks!
ご清聴ありがとうございました
▸ コード例はこちら▸ https://github.com/mogproject/example-graphx
クリスマスに働く人のイラスト © いらすとや