Slide 1

Slide 1 text

Neo4j with Spark for Big Data Analysis Machine Learning, Graph Analysis, Streaming 株式会社 DMM.comラボ ビッグデータ部 加嵜 ⻑⾨ 領家 ⾶⿃ 2016年11⽉17⽇ Neo4j ユーザー勉強会 #9

Slide 2

Slide 2 text

Copyright © since 1998 DMM All Rights Reserved. 2 ⽬的 ユーザの購⼊履歴などの ビッグデータを⽤いて サービスの向上を⽬指す ユーザのページ閲覧履歴 ユーザの購⼊履歴 ユーザのクリック履歴 レコメンド 検索 など

Slide 3

Slide 3 text

\ビッグデータでグラフ処理/ Copyright © since 1998 DMM All Rights Reserved. 3 ⽬的 現在蓄積しているビッグ データでグラフ化 à リアルタイムレコメンド à ユーザログ分析 à カスタマージャーニー

Slide 4

Slide 4 text

加嵜 ⻑⾨ • Sparkエンジニア ü『詳解 Apache Spark』 領家 ⾶⿃ • 今年⼊ったばっかの新⼈ ü 研修中にグラフDB(Neo4j)に興味を持つ Copyright © since 1998 DMM All Rights Reserved. 4 ⾃⼰紹介 Neo4j… 使ってみたい http://gihyo.jp/book/2016/978-4-7741-8124-0 第8章 GraphX を 担当

Slide 5

Slide 5 text

Neo4jを使いたい… リアルタイムレコメンド Copyright © since 1998 DMM All Rights Reserved. 5 背景 リアルタイムにレコメン ド結果を反映させたい … バッチ à 動的に計算・反映 Neo4j レコメンド ユーザ

Slide 6

Slide 6 text

Neo4jを使いたい… ユーザログ分析 Copyright © since 1998 DMM All Rights Reserved. 6 背景 ユーザのログをNeo4jに 格納・ログ分析をしたい à Cypher, Sparkによる分析 Neo4j ログ 購⼊ 閲覧 クリック ユーザ

Slide 7

Slide 7 text

Neo4jを使いたい… カスタマージャーニー Copyright © since 1998 DMM All Rights Reserved. 7 背景 実際のユーザの⼀連の⾏ 動からカスタマージャー ニー分析を⾏いたい à レコメンド改善のヒント Neo4j 閲覧A 閲覧B 購⼊B

Slide 8

Slide 8 text

Neo4jを使いたい… Neo4j合宿 開催 ! ! Copyright © since 1998 DMM All Rights Reserved. 8 背景 Neo4jの知識をつけるた めに鎌倉でNeo4j合宿 • Webinar • Recommendation • Modeling

Slide 9

Slide 9 text

Copyright © since 1998 DMM All Rights Reserved. 9 Neo4j Neo4jに格納された データの分析 Cypher \\ 楽しい // ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌ …がいくつか課題も

Slide 10

Slide 10 text

Copyright © since 1998 DMM All Rights Reserved. 10 課題 Neo4jに格納したデータ をCypherでは分散処理で きない à ビッグデータ活⽤が難しい 分散処理ができない! Cypher Neo4j 分散処理

Slide 11

Slide 11 text

Copyright © since 1998 DMM All Rights Reserved. 11 課題 Neo4jにRDB等にある既 存のデータを持ってくる のが厳しい à 既存データの利⽤が難しい Neo4jへデータを持ってくるのが… Neo4j RDB 既存データ

Slide 12

Slide 12 text

Copyright © since 1998 DMM All Rights Reserved. 12 課題 RDBのデータをPythonなどで 整形・CSV出⼒し取り込む必 要がある à 単純に⾯倒… なぜCSVファイルなんて 作らなくちゃいけないんだ Neo4jへデータを持ってくるのが… Neo4j RDB 既存データ CSV Pythonなどで 整形・CSV出⼒

Slide 13

Slide 13 text

現状のビッグデータ運⽤ ビッグデータ部のすがた Copyright © since 1998 DMM All Rights Reserved. 13

Slide 14

Slide 14 text

• すべてのデータをHadoopに集約 Copyright © since 1998 DMM All Rights Reserved. 14 現状のビッグデータ 運⽤ サービスの業務データ、 ログデータをすべて Hadoopに集約している 業務データ ログデータ Hadoop HDFS 購⼊ログ 閲覧ログ 商品マスタ 会員 セグメント

Slide 15

Slide 15 text

• ⽤途に応じてデータ活⽤ Copyright © since 1998 DMM All Rights Reserved. 15 現状のビッグデータ 運⽤ 集約されたデータを、 「検索」「レコメンド」 「マーケティング」など の⽤途に応じて活⽤する 業務データ ログデータ Hadoop HDFS Solr 検索 Spark レコメンド SQL マーケティング

Slide 16

Slide 16 text

• 複雑な処理はSparkで分散処理 Copyright © since 1998 DMM All Rights Reserved. 16 現状のビッグデータ 運⽤ 特に、レコメンドで活⽤ しているSparkでは、機 械学習以外のさまざまな ライブラリが充実してい る Hadoop HDFS Spark 業務データ ログデータ 機械学習 グラフ処理 ストリーム処理

Slide 17

Slide 17 text

• Spark • DataFrames Copyright © since 1998 DMM All Rights Reserved. 17 Sparkとは? val df = spark.read.json("~/users.json") // DataFramesのデータ表⽰ df.show() +------+----+--------+ | name| age|location| +------+----+--------+ |Nagato| 27| Kure| |Yamato|null| Kure| | Asuka| 24| null| +------+----+--------+ Spark DataFramesは、 分散で保持されたデータ をSQLライクに操作する ためのAPI

Slide 18

Slide 18 text

• Spark • DataFrames Copyright © since 1998 DMM All Rights Reserved. 18 Sparkとは? DataFramesを⽤いて データの絞り込み (WHERE句に相当)を ⾏う例 // 年齢で絞り込み df.filter($"age" > 20).show() +------+----+--------+ | name| age|location| +------+----+--------+ |Nagato| 27| Kure| | Asuka| 24| null| +------+----+--------+

Slide 19

Slide 19 text

• Spark • DataFrames Copyright © since 1998 DMM All Rights Reserved. 19 Sparkとは? DataFramesを⽤いて データの集約とカウント を⾏う例 // GROUP BYで集約 df.groupBy("location").count().show() +--------+-----+ |location|count| +--------+-----+ | Kure| 2| | null| 1| +--------+-----+

Slide 20

Slide 20 text

• Spark • MLlib Copyright © since 1998 DMM All Rights Reserved. 20 Sparkとは? Spark MLlib は、スケー ラブルな機械学習を⼿軽 に実現するためのAPI // 協調フィルタリングのモデル作成 val als = new ALS() .setMaxIter(10) .setRegParam(0.01) .setUserCol("userId") .setItemCol("productId") .setRatingCol("rating") val model = als.fit(ratings)

Slide 21

Slide 21 text

• Spark • GraphX Copyright © since 1998 DMM All Rights Reserved. 21 Sparkとは? Spark GraphXは、プロ パティグラフに対して分 散グラフ処理を⾏うため のAPI val g = GraphGenerators.gridGraph( sc, rows = 3, cols = 4) // ⽣成されたグラフのtripletを⼀覧表⽰ g.triplets.collect.foreach(println(_)) ((0,(0,0)),(1,(0,1)),1.0) ((0,(0,0)),(4,(1,0)),1.0) ((1,(0,1)),(2,(0,2)),1.0) ... ((9,(2,1)),(10,(2,2)),1.0) ((10,(2,2)),(11,(2,3)),1.0)

Slide 22

Slide 22 text

• Spark • GraphFrames Copyright © since 1998 DMM All Rights Reserved. 22 Sparkとは? GraphFramesは、 DataFramesとGraphXを 統合するためのSpark サードパーティ製パッ ケージ val friends = examples.Graphs.friends friends.triplets.show() +------------+--------------+--------------+ | edge| src| dst| +------------+--------------+--------------+ |[a,b,friend]| [a,Alice,34]| [b,Bob,36]| |[b,c,follow]| [b,Bob,36]|[c,Charlie,30]| |[c,b,follow]|[c,Charlie,30]| [b,Bob,36]| |[f,c,follow]| [f,Fanny,36]|[c,Charlie,30]| |[e,f,follow]| [e,Esther,32]| [f,Fanny,36]| |[e,d,friend]| [e,Esther,32]| [d,David,29]| +------------+--------------+--------------+

Slide 23

Slide 23 text

• Spark • GraphFrames Copyright © since 1998 DMM All Rights Reserved. 23 Sparkとは? GraphFramesでは、 Neo4jと同様にCypherに よる問い合わせやグラフ 操作も可能 // Cypherクエリによる問い合わせ g.find( " (a)-[]->(x); (b)-[]->(x);" + " (b)-[]->(y); !(a)-[]->(y)" ).groupBy( "a.user", "y.item" ).count().show() +----+----+-----+ |user|item|count| +----+----+-----+ | u1| i4| 2| | u2| i1| 2| +----+----+-----+

Slide 24

Slide 24 text

• Spark • Structured Streaming Copyright © since 1998 DMM All Rights Reserved. 24 Sparkとは? Spark Structured Streamingは、 DataFramesと同等のイ ンターフェースでスト リーム処理を⾏うAPI val lines = spark.readStream.format("socket").load() lines.as[String]. flatMap(_.split(" ")).groupBy("value").count() --------------------------------------- Batch: 0 --------------------------------------- +------+-----+ | value|count| +------+-----+ |apache| 1| | spark| 1| +------+-----+

Slide 25

Slide 25 text

Neo4jとSparkの連携 Copyright © since 1998 DMM All Rights Reserved. 25

Slide 26

Slide 26 text

• Neo4j-spark-connector Copyright © since 1998 DMM All Rights Reserved. 26 Neo4jとSparkの連携 Neo4j 3.0から実装され たboltプロトコルを⽤い て、Neo4jとSpark間の接 続を⾏う https://github.com/neo4j-contrib/neo4j-spark-connector https://neo4j.com/blog/neo4j-3-0-milestone-1-release/ Neo4j Spark Bolt オンライン トランザクション ⼤規模な分散処理 データロードに 中間データ (CSV)が不要 機械学習 グラフ処理 ストリーム処理 バイナリプロト コルによる⾼ス ループット・低 レイテンシ

Slide 27

Slide 27 text

実践 Neo4j-Spark-Connector DataFrame, GraphX, GraphFrame Copyright © since 1998 DMM All Rights Reserved. 27

Slide 28

Slide 28 text

Copyright © since 1998 DMM All Rights Reserved. 28

Slide 29

Slide 29 text

Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights Reserved. 29 DataFrameの利⽤ ・spark-shellの起動 オプションで以下を設定… • Neo4j(bolt)のホストを設定 • Neo4jのユーザ名を設定 • Neo4jのパスワードを設定 • neo4j-spark-connectorと GraphFrameのパッケージを追加 >> $SPARK_HOME/bin/spark-shell ¥ --conf spark.neo4j.bolt.url=bolt:// ¥ --conf spark.neo4j.bolt.user= ¥ --conf spark.neo4j.bolt.password= ¥ --packages neo4j-contrib:neo4j-spark-connector:2.0.0- M2,graphframes:graphframes:0.2.0-spark2.0-s_2.11

Slide 30

Slide 30 text

Copyright © since 1998 DMM All Rights Reserved. 30 >> DataFrameの利⽤

Slide 31

Slide 31 text

Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights Reserved. 31 DataFrameの利⽤ “Apllo 13”に出演した俳 優の名前をDataFrameと して取得し表⽰ // spark-neo4j-connectorのインポート scala> import org.neo4j.spark._ // Sparkとneo4jをつなぐおまじない scala> val neo = Neo4j(sc) // DataFrameを作成 scala> val ActorNames = |neo.cypher(" |MATCH (p:Person)-[a:ACTED_IN]->(m:Movie) |WHERE m.title = 'Apllo 13' |RETURN p.name AS actor |").loadDataFrame // 結果を表⽰ scala> ActorNames.show

Slide 32

Slide 32 text

Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights Reserved. 32 DataFrameの利⽤ neo.cypher() … openCypherでクエリを実⾏ loadDataFrame() … DataFrameとして取得 // spark-neo4j-connectorのインポート scala> import org.neo4j.spark._ // Sparkとneo4jをつなぐおまじない scala> val neo = Neo4j(sc) // DataFrameを作成 scala> val ActorNames = |neo.cypher(" |MATCH (p:Person)-[a:ACTED_IN]->(m:Movie) |WHERE m.title = 'Apllo 13' |RETURN p.name AS actor |").loadDataFrame // 結果を表⽰ scala> ActorNames.show

Slide 33

Slide 33 text

Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights Reserved. 33 DataFrameの利⽤ ActorNames.show() … ActorNamesを表⽰ // spark-neo4j-connectorのインポート scala> import org.neo4j.spark._ // Sparkとneo4jをつなぐおまじない scala> val neo = Neo4j(sc) // DataFrameを作成 scala> val ActorNames = |neo.cypher(" |MATCH (p:Person)-[a:ACTED_IN]->(m:Movie) |WHERE m.title = 'Apllo 13' |RETURN p.name AS actor |").loadDataFrame // 結果を表⽰ scala> ActorNames.show

Slide 34

Slide 34 text

Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights Reserved. 34 DataFrameの利⽤ WHEREの条件などのパラ メータを後から与える場合は param(pram名: String, pram: Any) … パラメータが⼀つの場合 params(prams: Map(String, Any)) … パラメータが2つ以上の場合 を⽤いる // DataFrameを作成 scala> val ActorNames = |neo.cypher(" |MATCH (p:Person)-[a:ACTED_IN]- >(m:Movie) |WHERE m.title = {title} |RETURN p.name AS actor LIMIT {limit} |") |.params(Map("title"->"Apollo 13", "limit"->2)) |.loadDataFrame // 結果を表⽰ scala> ActorNames.show

Slide 35

Slide 35 text

Copyright © since 1998 DMM All Rights Reserved. 35 >> GraphXでPageRank

Slide 36

Slide 36 text

Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights Reserved. 36 GraphXでPageRank “REVIEWD”の関係で繋 がれたグラフのページラ ンクを計算 à 結果をNeo4jへ保存

Slide 37

Slide 37 text

Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights Reserved. 37 GraphXでPageRank Neo4jGraph.loadGraph … グラフの読み込み 指定した ノード-エッジ-ノード のグラフを読み込める // REVIEWEDでつながったグラフの読み込み scala> val reviewedGraph = |Neo4jGraph.loadGraph( |sc, |"Person", |Seq("REVIEWED"), |"Movie" |)

Slide 38

Slide 38 text

Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights Reserved. 38 GraphXでPageRank Neo4jGraph.loadGraph … PageRankを計算 引数は ・PageRankを計算したいグラフ ・計算の繰り返し回数 // GraphXとGraphX.libのインポート scala> import org.apache.spark.graphx._ scala> import org.apache.spark.graphx.lib._ // PageRankを計算 scala> val pageRank = |PageRank.run(reviewedGraph, 10)

Slide 39

Slide 39 text

Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights Reserved. 39 GraphXでPageRank “REVIEWD”の関係で繋 がれたグラフのページラ ンクを計算 à 結果をNeo4jへ格納 // Neo4jにPageRankをrank(プロパティ)としてSave scala> Neo4jGraph.saveGraph(sc, pageRank, "rank")

Slide 40

Slide 40 text

Copyright © since 1998 DMM All Rights Reserved. 40 Neo4j 既存データ Neo4j-spark- connector Spark Hadoop

Slide 41

Slide 41 text

Copyright © since 1998 DMM All Rights Reserved. 41 \ \いけるな、ガハハ//

Slide 42

Slide 42 text

Copyright © since 1998 DMM All Rights Reserved. 42 それっぽい関数もある!.........

Slide 43

Slide 43 text

Copyright © since 1998 DMM All Rights Reserved. 43 ( ゚д゚) …ん

Slide 44

Slide 44 text

Copyright © since 1998 DMM All Rights Reserved. 44 それっぽい...関数...?

Slide 45

Slide 45 text

Copyright © since 1998 DMM All Rights Reserved. 45 (つд⊂)ゴシゴシ

Slide 46

Slide 46 text

Copyright © since 1998 DMM All Rights Reserved. 46 UpdateNodes...?

Slide 47

Slide 47 text

Copyright © since 1998 DMM All Rights Reserved. 47 \ \CREATE できない//

Slide 48

Slide 48 text

まとめ Neo4j-Spark-Connectorを使ってみて… Copyright © since 1998 DMM All Rights Reserved. 48

Slide 49

Slide 49 text

• Neo4j 3.0以上, Spark 2.0以上が必要 Copyright © since 1998 DMM All Rights Reserved. 49 考察 利⽤しているバージョン 要確認!!

Slide 50

Slide 50 text

• 利⽤するのは簡単! ..ただしCREATEは未実装 Copyright © since 1998 DMM All Rights Reserved. 50 考察 これが⼀番つらい

Slide 51

Slide 51 text

• まだGraphFramesからsaveできない Copyright © since 1998 DMM All Rights Reserved. 51 考察 GraphFrame関連の 実装がまだスカスカ

Slide 52

Slide 52 text

• まだCypherの表現⼒は弱い Copyright © since 1998 DMM All Rights Reserved. 52 考察 今後に期待…!!

Slide 53

Slide 53 text

• 機能拡張 • Neo4jへの新規データ作成機能 • GraphFrames Cypherの強化 • 応⽤ • カスタマージャーニー分析 • リアルタイムレコメンド Copyright © since 1998 DMM All Rights Reserved. 53 今後の展望