Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Neo4j with Spark for Big Data Analysis

B6d9eb9a3825f15c84b5e7588c56a405?s=47 DMM.com
March 16, 2018

Neo4j with Spark for Big Data Analysis

B6d9eb9a3825f15c84b5e7588c56a405?s=128

DMM.com

March 16, 2018
Tweet

Transcript

  1. Neo4j with Spark for Big Data Analysis Machine Learning, Graph

    Analysis, Streaming 株式会社 DMM.comラボ ビッグデータ部 加嵜 ⻑⾨ 領家 ⾶⿃ 2016年11⽉17⽇ Neo4j ユーザー勉強会 #9
  2. Copyright © since 1998 DMM All Rights Reserved. 2 ⽬的

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

    ⽬的 現在蓄積しているビッグ データでグラフ化 à リアルタイムレコメンド à ユーザログ分析 à カスタマージャーニー
  4. 加嵜 ⻑⾨ • 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 を 担当
  5. Neo4jを使いたい… リアルタイムレコメンド Copyright © since 1998 DMM All Rights Reserved.

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

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

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

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

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

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

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

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

    13
  14. • すべてのデータをHadoopに集約 Copyright © since 1998 DMM All Rights Reserved.

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

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

    16 現状のビッグデータ 運⽤ 特に、レコメンドで活⽤ しているSparkでは、機 械学習以外のさまざまな ライブラリが充実してい る Hadoop HDFS Spark 業務データ ログデータ 機械学習 グラフ処理 ストリーム処理
  17. • 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
  18. • 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| +------+----+--------+
  19. • 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| +--------+-----+
  20. • 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)
  21. • 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)
  22. • 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]| +------------+--------------+--------------+
  23. • 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| +----+----+-----+
  24. • 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| +------+-----+
  25. Neo4jとSparkの連携 Copyright © since 1998 DMM All Rights Reserved. 25

  26. • 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)が不要 機械学習 グラフ処理 ストリーム処理 バイナリプロト コルによる⾼ス ループット・低 レイテンシ
  27. 実践 Neo4j-Spark-Connector DataFrame, GraphX, GraphFrame Copyright © since 1998 DMM

    All Rights Reserved. 27
  28. Copyright © since 1998 DMM All Rights Reserved. 28

  29. 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://<HOSTNAME:PORT> ¥ --conf spark.neo4j.bolt.user=<USERNAME> ¥ --conf spark.neo4j.bolt.password=<PASSWORD> ¥ --packages neo4j-contrib:neo4j-spark-connector:2.0.0- M2,graphframes:graphframes:0.2.0-spark2.0-s_2.11
  30. Copyright © since 1998 DMM All Rights Reserved. 30 >>

    DataFrameの利⽤
  31. 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
  32. 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
  33. 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
  34. 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
  35. Copyright © since 1998 DMM All Rights Reserved. 35 >>

    GraphXでPageRank
  36. Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights

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

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

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

    \いけるな、ガハハ//
  42. Copyright © since 1998 DMM All Rights Reserved. 42 それっぽい関数もある!.........

  43. Copyright © since 1998 DMM All Rights Reserved. 43 (

    ゚д゚) …ん
  44. Copyright © since 1998 DMM All Rights Reserved. 44 それっぽい...関数...?

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

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

  47. Copyright © since 1998 DMM All Rights Reserved. 47 \

    \CREATE できない//
  48. まとめ Neo4j-Spark-Connectorを使ってみて… Copyright © since 1998 DMM All Rights Reserved.

    48
  49. • Neo4j 3.0以上, Spark 2.0以上が必要 Copyright © since 1998 DMM

    All Rights Reserved. 49 考察 利⽤しているバージョン 要確認!!
  50. • 利⽤するのは簡単! ..ただしCREATEは未実装 Copyright © since 1998 DMM All Rights

    Reserved. 50 考察 これが⼀番つらい
  51. • まだGraphFramesからsaveできない Copyright © since 1998 DMM All Rights Reserved.

    51 考察 GraphFrame関連の 実装がまだスカスカ
  52. • まだCypherの表現⼒は弱い Copyright © since 1998 DMM All Rights Reserved.

    52 考察 今後に期待…!!
  53. • 機能拡張 • Neo4jへの新規データ作成機能 • GraphFrames Cypherの強化 • 応⽤ •

    カスタマージャーニー分析 • リアルタイムレコメンド Copyright © since 1998 DMM All Rights Reserved. 53 今後の展望