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

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
  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. • すべてのデータをHadoopに集約 Copyright © since 1998 DMM All Rights Reserved.

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

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

    16 現状のビッグデータ 運⽤ 特に、レコメンドで活⽤ しているSparkでは、機 械学習以外のさまざまな ライブラリが充実してい る Hadoop HDFS Spark 業務データ ログデータ 機械学習 グラフ処理 ストリーム処理
  16. • 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
  17. • 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| +------+----+--------+
  18. • 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| +--------+-----+
  19. • 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)
  20. • 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)
  21. • 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]| +------------+--------------+--------------+
  22. • 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| +----+----+-----+
  23. • 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| +------+-----+
  24. • 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)が不要 機械学習 グラフ処理 ストリーム処理 バイナリプロト コルによる⾼ス ループット・低 レイテンシ
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. Spark-Shell での実⾏例 (映画のやつ) Copyright © since 1998 DMM All Rights

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

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

    既存データ Neo4j-spark- connector Spark Hadoop
  35. • Neo4j 3.0以上, Spark 2.0以上が必要 Copyright © since 1998 DMM

    All Rights Reserved. 49 考察 利⽤しているバージョン 要確認!!
  36. • 機能拡張 • Neo4jへの新規データ作成機能 • GraphFrames Cypherの強化 • 応⽤ •

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