$30 off During Our Annual Pro Sale. View Details »

Neo4j with Spark for Big Data Analysis

DMM.com
March 16, 2018

Neo4j with Spark for Big Data Analysis

DMM.com

March 16, 2018
Tweet

More Decks by DMM.com

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  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 を
    担当

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    Hadoop
    HDFS
    Spark
    業務データ
    ログデータ
    機械学習
    グラフ処理
    ストリーム処理

    View Slide

  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

    View Slide

  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|
    +------+----+--------+

    View Slide

  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|
    +--------+-----+

    View Slide

  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)

    View Slide

  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)

    View Slide

  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]|
    +------------+--------------+--------------+

    View Slide

  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|
    +----+----+-----+

    View Slide

  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|
    +------+-----+

    View Slide

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

    View Slide

  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)が不要
    機械学習
    グラフ処理
    ストリーム処理
    バイナリプロト
    コルによる⾼ス
    ループット・低
    レイテンシ

    View Slide

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

    View Slide

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

    View Slide

  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:// ¥
    --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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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"
    |)

    View Slide

  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)

    View Slide

  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")

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide