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

グラフ型データベース 「Amazon Neptune」が丸裸にする クラスメソッド大阪オフィス

TomoyaIwata
October 11, 2019

グラフ型データベース 「Amazon Neptune」が丸裸にする クラスメソッド大阪オフィス

2019/10/11に開催されたDevelopers.IO 2019 in 大阪で発表させて頂いた際の資料です

TomoyaIwata

October 11, 2019
Tweet

More Decks by TomoyaIwata

Other Decks in Technology

Transcript

  1. グラフ型データベース 「Amazon Neptune」が丸裸にする クラスメソッド⼤阪オフィス 2019年10⽉11⽇ CX事業本部 岩⽥ 智哉

  2. スライドは後で⼊⼿することが出来ますので 発表中の内容をメモする必要はありません。 写真撮影をする場合は フラッシュ・シャッター⾳が出ないようにご配慮ください Attention

  3. 3 ⾃⼰紹介 lクラスメソッド株式会社 lサーバーレス開発部 改め CX事業本部 l⼤阪オフィス所属 l好きなAWSサービス: AWS Lambda

    岩⽥ 智哉
  4. 4 今⽇話したいこと ・グラフ型データベースに関する基礎 ・Amazon Neptuneに関する基礎 ・グラフ型データベースを使った分析例

  5. 5 想定しているターゲット ・グラフ型データベースが何か分からない⼈ ・Amazon Neptuneが何か分からない⼈

  6. 6 グラフ型データベースis何︖

  7. 7 グラフ型データベースとは • グラフ構造を表現することに特化したDB • データ間の関連性をネットワーク構造で表現 • プロパティグラフモデルとRDFモデルに⼤別さ れる ※本セッションではプロパティグラフモデルのみ扱います

  8. 8 プロパティグラフモデルの構成要素 • ノード(頂点) • グラフの基礎となるエンティティ • エッジ(リレーション) • ノード間の関連性を表す要素

    • ラベル • ノード・エッジの種別を表す付加情報 • プロパティ • ノード・エッジの属性情報
  9. 9 プロパティグラフモデルの構成要素 person event person person name:user1 age: 30 name:Developers.IO

    2019 in ⼤阪 date:2019/10/11 join join join person join name:user2 age: 32 name:user4 age: 28 name:user3 age: 40
  10. 10 プロパティグラフモデルの構成要素(ノード) person event person person name:user1 age: 30 name:Developers.IO

    2019 in ⼤阪 date:2019/10/11 join join join person join name:user2 age: 32 name:user4 age: 28 name:user3 age: 40 ノード ノード ノード ノード ノード
  11. 11 プロパティグラフモデルの構成要素(エッジ) person event person person name:user1 age: 30 name:Developers.IO

    2019 in ⼤阪 date:2019/10/11 join join join person join name:user2 age: 32 name:user4 age: 28 name:user3 age: 40 エッジ エッジ エッジ エッジ
  12. 12 プロパティグラフモデルの構成要素(ラベル) person event person person name:user1 age: 30 name:Developers.IO

    2019 in ⼤阪 date:2019/10/11 join join join person join name:user2 age: 32 name:user4 age: 28 name:user3 age: 40 ラベル ラベル ラベル ラベル ラベル ラベル ラベル ラベル ラベル
  13. 13 プロパティグラフモデルの構成要素(プロパティ) person event person person name:user1 age: 30 name:Developers.IO

    2019 in ⼤阪 date:2019/10/11 join join join person join name:user2 age: 32 name:user4 age: 28 name:user3 age: 40 プロパティ プロパティ プロパティ プロパティ プロパティ
  14. 14 代表的なグラフ型データベース • neo4j • 恐らく現状最も⼈気の⾼いグラフ型データベース • パナマ⽂書の分析で有名に • TitanDB

    -> JanusGraph • Titanは開発停⽌ TitanからforkしたJanusGraphがLinux Foundation 配下のプロジェクトとして開発継続中 • バックエンドのDBにApache CassandraやElasticsearchが利⽤可能
  15. 15 グラフ型データベースのユースケース • ソーシャルネットワーキング • レコメンデーション • 最短経路や配送ルートの検索 • ネットワーク機器の管理

  16. 16 クエリ⾔語 • Cypher • neo4jで利⽤ • Gremlin • 様々なグラフ型データベースで利⽤可能な標準化されたクエリ

    ⾔語 • SPARQL • RDFモデルで利⽤するクエリ⾔語
  17. 17 Amazon Neptuneとは • AWSが提供するフルマネージドなグラフDBサービス • クエリ⾔語はGremlinとSPARQLに対応 • 毎秒100,000件のクエリをサポート •

    最⼤15個のリードレプリカをサポート • インデックスの作成が不要
  18. 18 Amazon Neptuneの利⽤事例 NIKEアプリのバックエンドで利⽤ • Cassandra on EC2の構成からNeptuneへ移⾏ • EC2の保守作業が不要に

    • 複数のクエリで実現していた処理が1つのクエリで実現可能に • Cassandraよりも少ないvCPU,メモリでも処理が⾼速に • Amazon NeptuneはCloudwatchと統合されているためモニタリ ングがシンプルに
  19. 19 Amazon Neptuneの料⾦体系 ※2019年9⽉時点の東京リージョンでの料⾦ インスタンスタイプ 料⾦ db.r5.large 0.42USD/時間 db.r5.xlarge 0.84USD/時間

    db.r5.2xlarge 1.68USD/時間 db.r5.4xlarge 3.36USD/時間 db.r5.12xlarge 10.08USD/時間 db.r4.large 0.42USD/時間 db.r4.xlarge 0.84USD/時間 db.r4.2xlarge 1.68USD/時間 db.r4.4xlarge 3.36USD/時間 db.r4.8xlarge 6.72USD/時間 ストレージ料⾦ GB あたり⽉額料⾦ 0.12USD I/O 料⾦ 0.24USD/100 万件のリクエスト オンデマンドのインスタンス料⾦ データベースストレージおよびIO バックアップストレージ ストレージスナップショット料⾦ GB あたり⽉額 0.023USD インターネットへのデータ転送送信 (アウト) 1 GB まで/⽉ 0.00USD/GB 次の 9.999 TB/⽉ 0.12USD/GB 次の 40 TB/⽉ 0.09USD/GB 次の 100 TB/⽉ 0.07USD/GB 150 TB /⽉より⼤きい 0.05USD/GB
  20. 20 検証時の注意点 • ⼩さ⽬のインスタンスタイプが選択できない • 停⽌ができない RDSと⽐較すると・・・ 検証⽬的での利⽤時はコストに注意を︕︕

  21. 21 やってみる

  22. 22 免責事項 • グラフ理論とか良くわかってません • グラフ型データベースも初⼼者です • モデリングとかクエリとか⾊々おかしい可能性があ ります •

    グラフ型データベースでこんな遊び⽅ができる と いう参考程度に流し聞きして下さい
  23. 23 分析対象 • 2019年1⽉からチャットツールをSlackへ段階移⾏ • 2019年7⽉完全移⾏完了 • 1,000以上のパブリックチャンネルが存在 • カスタム絵⽂字4,000オーバー

    チャンネル#misc-osakaを分析対象に選定
  24. 24 #misc-osaka • ⼤阪オフィス雑談部屋 • 参加⼈数80名 • (純粋な⼤阪オフィス所属メンバーは約30名) • Publicチャンネルで1,2を争う投稿数の多さ

  25. Private subnet 25 構成 Amazon Neptune AWS Cloud VPC Public

    subnet Amazon EC2 データLoad クエリ発⾏ Amazon Simple Storage Service (S3) AWS Lambda #misc-osakaの やり取りを抽出 抽出結果を S3に保存
  26. 26 Slackのやり取りを モデリングする

  27. 27 モデリング

  28. 28 完成したモデル user post user user name:iwata text: :coffee:ドリップ開始 post

    react react name:xxx name:yyy name:arigato name:kansya
  29. 29 紛らわしいので以後は エッジを「ポスト」 ノードを「投稿」 として説明します

  30. 30 分析してみる

  31. 31 分析1 岩⽥がリアクションしている相⼿ TOP5

  32. 32 分析1のクエリ g.V().has('id', '<iwata-id>').as('iwata') ¥ .out('react').in('post') ¥ .where(neq('iwata')) ¥ .groupCount().by('name')

    ¥ .order(local) ¥ .by(values,desc) ¥ .limit(local, 5).unfold();
  33. 33 岩⽥がよくリアクションしてる⼈ 1位... ⼭下 2位...中安 3位...niino 4位...たまちゃん 5位...沼尻

  34. 34 岩⽥と⼭下の関連性 post post react post post post post post

    post react react react
  35. 35 分析2 岩⽥がリアクションしている相⼿ TOP5 がリアクションしている相⼿ TOP5

  36. 36 分析2のクエリ g.V().has('id', '<iwata-id>').as('iwata')¥ .out('react').in('post').where(neq('iwata'))¥ .groupCount().order(local)¥ .by(values, desc).limit(local, 5)¥ .unfold().select(keys)

    ¥ .group().by('name')¥ .by(out('react').in('post').groupCount()¥ .by('name').order(local)¥ .by(values, desc).limit(local, 5)).unfold()
  37. 37 ⼭下ランキング 1位...丸⽑ 2位...たまちゃん 3位...niino 4位...岩⽥ 5位...市⽥

  38. 38 中安ランキング 1位...⼭下 2位...市⽥ 3位...岩⽥ 4位...沼尻 5位...たまちゃん

  39. 39 niinoランキング 1位...⼭下 2位...たまちゃん 3位...中安 4位...岩⽥ 5位...meltedice

  40. 40 たまちゃんランキング 1位...⼭下 2位...中安 3位...岩⽥ 4位...丸⽑ 5位...niino

  41. 41 沼尻ランキング 1位...⼭下 2位...中安 3位...岩⽥ 4位...丸⽑ 5位...たまちゃん

  42. 42 リアクション数で表した関連性 user

  43. 43 分析3 岩⽥に紐付く?? リアクションの使⽤状況

  44. 44 分析3 :otokoiwata: :iwataryuou: :dragoniwata: :mocchie: :xxxxxxx: :levis:

  45. 45 分析3 岩⽥系のリアクションが付く 投稿をポストしているメンバーを リアクション別に上位3名 ただし岩⽥は除く

  46. 46 分析3 こういう投稿が多い ユーザーを集計

  47. 47 分析3のクエリ g.V().inE('react').has('name',within('otokoiwata',,,))¥ .group().by('name').unfold()¥ .project('react','cnt_by_user')¥ .by(select(keys))¥ .by(select(values).unfold().inV().in('post')¥ .not(has('id’, ‘<iwata_id>'))¥ .groupCount().by('name')¥

    .order(local).by(values,desc).limit(local,3))
  48. 48 分析3 ちゃだいん me 丸⽑ 丸⽑ 丸⽑ ちゃだいん ちゃだいん 中安

    ⼭⽥
  49. 49 分析3 ⼭下 motchie 中安 me 中安 たまちゃん ⻄⽥ ⼭下

    ⼭下
  50. 50 分析4 岩⽥が登録したカスタム絵⽂字による リアクションの使⽤状況

  51. 51 分析4 :kaiserwave: :kaiserwave_rugal: :genocide_cutter:

  52. 52 カイザーウェーブ ヴォルフガング・クラウザーの超必殺技。初出の『餓狼伝説2』のみ必殺技。後に『ザ・キング・オブ・ ファイターズ』シリーズのルガール・バーンシュタインも必殺技として使⽤。「カイザーウェーブ」と表 記されることもある。 両腕を⼤きく広げて構えた後に前⽅に突き出しながら巨⼤な気弾を放つ⾶び道具。 ⻑⾝のクラウザーが放つに相応しい巨⼤な⾶び道具は当時⼤きなインパクトがあった。後に『KOF'94』の ボスであるルガールが烈⾵拳と共にこの技を使いこなしてみせたことでプレイヤーにさらに衝撃を与え、 『KOF』のボスとして初登場したルガールの⼒量に説得⼒を持たせることにも⼀役買った。 クラウザーとルガールが格闘ゲーム上で初共演した『KOF'98

    UM』では彼らが互いにカイザーウェイブを 撃ち合う掛け合いがある(同作では本来カイザーウェイブを使⽤しないオメガ・ルガールもこのときはカ イザーウェイブを使⽤する) 格ゲー.com (https://kakuge.com/wiki/)より引⽤ 概要 カイザーウェイブ
  53. 53 分析4 あるユーザーが ポストした投稿に :kaiserwave:でリアクションしたユーザー がポストした投稿に :kaiserwave:でリアクション...

  54. 54 分析4 :kaiserwave:が N連鎖する経路を求める

  55. 55 分析4のクエリ 1 g.V().repeat(out('post')¥ .inE().has('name','kaiserwave')¥ .outV().dedup()).times(1).path() 経路数:15

  56. 56 分析4のクエリ 2 g.V().repeat(out('post')¥ .inE().has('name','kaiserwave')¥ .outV().dedup()).times(2).path() 経路数:7

  57. 57 分析4のクエリ 3 g.V().repeat(out('post')¥ .inE().has('name','kaiserwave')¥ .outV().dedup()).times(3).path() 経路数:9

  58. 58 kaiserwaveが3連鎖する経路 kaiserwave ※投稿のノードは表⽰を省略 kaiserwave kaiserwave kaiserwave kaiserwave kaiserwave kaiserwave

    kaiserwave kaiserwave kaiserwave 森岡 kaiserwave kaiserwave kaiserwave
  59. 59 まとめ

  60. 60 まとめ • グラフ型データベースを利⽤することで、RDBでは実現 が難しい各種の分析が実現できる • Amazon Neptuneを利⽤することで、他のグラフ型データ ベースでは得られない様々なメリットが享受できる •

    グラフ型データベースを使った分析は楽しい︕︕
  61. 61 Amazon Neptuneを 是⾮お試し下さい︕︕ まとめ

  62. 62 ご静聴ありがとうございました

  63. None