Post on 09-Aug-2015
‹#›
!Spark Streaming & Spark GraphX を使用したTwitter解析による レコメンドサービス例
GMOインターネット株式会社 次世代システム研究室 野田純一
2015.6.25
‹#›
Overview1.自己紹介
2.研究目的
3.検証サービス説明
4.Spark Streamingを使用したオンラインTwitter解析によるレコメンドシステム 「Mikasa」-三笠
5.Sparkについて
6.Spark Streamingについて
7.Spark Streaming + Spark GraphXを使用したTwitter解析とレコメンドシステム 「Ikazuchi」-雷
8.Spark GraphXについて
9.参考文献紹介
10.まとめ
‹#›
1. 自己紹介 野田純一■結構前
Java2EEによる業務オペレーションシステム
■ちょっと前
Perl/Rubyでソーシャルゲーム フレームワーク開発
■最近
Hadoopでアドテク
!Github: https://github.com/AKB428
Twitter: @n428dev
Qiita: http://qiita.com/AKB428
Hatena: http://akb428.hatenablog.com/
本部: http://akibalab.info/
Junichi Noda Larry Wall
‹#›
‹#›
2. 研究目的
• ストリーミング処理でTwitterオンライン解析がしたい▶Spark Streaming
• Twitterのソーシャル・ネットワークグラフを解析したい▶Spark GraphX
• SparkをScalaで書いてScalaの知見をためる。
• Sparkを利用したサービスの事例が少ないため実際に検証用のマイクロ サービスを設計、実装、運用を行いリファレンス的なサービスを作って業界に還元する。
‹#›
3. 検証サービス説明
‹#›
‹#›
4. Spark Streamingを使用したオンラインTwitter解析によるレコメンドシステム
「Mikasa」-三笠
!!
https://github.com/AKB428/mikasa_ol https://github.com/AKB428/mikasa_rs
!
‹#›
‹#›
‹#›
‹#›
• Twitterストリームからデータを取得する。
• Twitter Streaming APIを使う。
• 400の検索キーワードが指定可能。
• Spark Stremingでリアルタイム集計を行う。
‹#›
!• 日本語文章を単語にわけて分解して集計
• 日本語を分解するため形態素解析ライブラリkuromojiを使う。
• アニメ作品など標準辞書にない単語はユーザー辞書(CSV)を用意。
‹#›
形態素解析ライブラリの必要性について
‹#›
ユーザー辞書の必要性について
‹#›
Spark Streamingによるウィンドウ集計の活用
Mikasaは直近5分、直近60分のデータ集計を毎分行っている。(合計60*2=120回)
少ないソースコードで、ウィンドウ集計が可能。
‹#›
• ソースコード
• https://github.com/AKB428/mikasa_ol/blob/master/src/main/scala/mikasa.scala
‹#›
‹#›
画面デモ(直近5分を毎分集計)
(F1)2015年2期 TVアニメ http://tv-anime.xyz/5/
(F1)ラブライブ http://tv-anime.biz/5/
(F2)ラブライブ http://lovelive-net.com/5/
(F2)秋葉原 http://akiba-net.com/5/
(F2)関東TV番組 http://telev.net/5/
F1=ユーザー辞書に登録してある単語のみ集計
F2=ユーザー辞書外の単語も集計
‹#›
画面デモ(直近60分を毎分集計)
(F1)2015年2期 TVアニメ http://tv-anime.xyz/60/
(F1)ラブライブ http://tv-anime.biz/60/
(F2)ラブライブ http://lovelive-net.com/60/
(F2)秋葉原 http://akiba-net.com/60/
(F2)関東TV番組 http://telev.net/60/
F1=ユーザー辞書に登録してある単語のみ集計
F2=ユーザー辞書外の単語も集計
‹#›
画面デモ 過去の履歴キャプチャ
‹#›
デモ:リコメンドTwitterボット
https://twitter.com/Akihabaara_itso https://twitter.com/AuctionMadoka !
‹#›
サーバーデモ
動作中のサーバーのコンソールを公開
‹#›
ユーザー体験デモ(直近5分集計)携帯でアクセス!
(F1)2015年2期 TVアニメ http://tv-anime.xyz/5/
(F1)ラブライブ http://tv-anime.biz/5/
(F2)ラブライブ http://lovelive-net.com/5/
(F2)秋葉原 http://akiba-net.com/5/
(F2)関東TV番組 http://telev.net/5/
F1=ユーザー辞書に登録してある単語のみ集計
F2=ユーザー辞書外の単語も集計
‹#›
ユーザー体験デモ(直近60分集計)携帯でアクセス
(F1)2015年2期 TVアニメ http://tv-anime.xyz/60/
(F1)ラブライブ http://tv-anime.biz/60/
(F2)ラブライブ http://lovelive-net.com/60/
(F2)秋葉原 http://akiba-net.com/60/
(F2)関東TV番組 http://telev.net/60/
F1=ユーザー辞書に登録してある単語のみ集計
F2=ユーザー辞書外の単語も集計
‹#›
• Mikasa Twitter のデータ収集解析の2つのアプローチについて
• ①Twitter Filter + ユーザー辞書のみの単語で絞る
• 1のメリット▶集計しやすい、後続の処理も設計しやすい。
• 1のデメリット▶未知の単語を拾えない、ユーザー辞書にひもづく別のワードを拾えない
• 結論:ある程度、解析対象のドメインが固定されているものにはこのアプローチは有効
‹#›
• ② Twitter Filter + ユーザー辞書を使いつつ全ての単語を集計
• メリット▶ 未知のワードが拾える、リアルなネットワーク解析ができる。
• デメリット▶ ジャンクワードが多く出現するのでデータクレンジングの作業にコストがかかる。
• 結論:解析対象が不明なドメインの場合、まずこのアプローチで回す。計測対象のネットワークが変動しやすいドメインの場合はこのアプローチが有効。ある程度アプローチ2で回してアプローチ1に切り替える、もしくはアプローチ1を追加した二段のサービスに設計する。
‹#›
Mikasaは申請ConoHaと
お名前.comのドメインで動いています。
‹#›
4. Spark Streaming ~ソースコード補足
• TwitterUtilは実体はJavaのTwitterライブラリであるtwitter4j
• Twitter解析にはTwitterAPI特有のAPIレートリミット、単一IPによる高負荷時のアクセス制限があるので注意
• Twitter開発者アカウントには電話番号が必須になったので気軽に開発はできなくなりつつある。
‹#›
5. Sparkについて
!!!!!• HadoopのMapReduceとは別アプローチ(DAG)での並列分散集計処理を行う
• インメモリー処理
• Hadoopエコシステムの一部として扱われるがHadoopと直接的な関係はない
• 2015年6月11日に 1.4.0 がリリース。https://spark.apache.org/releases/spark-release-1-4-0.html
• 1.4.0でSparkRが追加(R言語でSparkを利用できる)
• APIを利用できる言語はScala, Java, Python
SparkR
‹#›
5. Sparkについて ~Spark処理でのDAG
‹#›
5. Sparkについて~最近の情勢 • 2015年6月15日 IBMが開発者と研究者を3500人Spark関連プロジェクトに投入 http://japan.zdnet.com/article/35065964/
• 2015年 6月15~17日 Spark summit 2015 開催 (サンフランシスコ)
• NTTデータが定期的に勉強会を実施
• 国内のサービス実例は少ない
• 2大Hadoopディストリビューション CDHとHDPにはSparkが搭載
• Spark1.4からはUIでモニタリングも行えるようになった。
http://qiita.com/AKB428/items/71900eecdf2350e1e45f
‹#›
6. Spark Streaming について
!!!!!• Sparkサブシステムの一つでファイルからでなくリアルタイムに流れてくるストリームソースに対しての集計を対象としている。
• 直近1時間のツイート数を毎分集計する、直近3時間でアクセスが多いIPを集計する・・などのウィンドウ集計が可能。
‹#›
6. Spark Streaming ~データソースについて
!!!!!!その他、ssc.socketTextStream(" localhost", 7777)
とするとローカルポートをソースにできるのでサーバーのログを流し込んでリアルタイムにエラー、クラックIPの集計などが可能。
‹#›
Mikasaインストールについて
インストールマニュアル
https://gist.github.com/AKB428/c30bc6a979e05fa3a022 • TwitterAPIとAmazonAPIのアカウントがあれば1時間でセットアップ完了。
• AmazonAPIはリコメンドしない場合は不要。
• TwitterAPIのアカウント取得も10分程度で可能。
Mikasa OL https://github.com/AKB428/mikasa_ol Mikasa RS https://github.com/AKB428/mikasa_rs
‹#›
8. Spark Streaming + Spark GraphXを使用したTwitter解析とレコメンドシステム
「Ikazuchi」-雷
!https://github.com/AKB428/ikazuchi_ol https://github.com/AKB428/ikazuchi_rs
‹#›
‹#›
‹#›
ロジックを単純化するため
ACOOUNT:単語を”:”で連結したものをカウントしていく。
@akb428:ラブライブ,@akb428:アイマス,@odaken:俺物語
‹#›
‹#›
• Kafkaをソースとして受け取りストリーム処理
• 受け取ったものを順次GraphXに渡していく
‹#›
関連商品の2階層目までを取得
‹#›
グラフ解析の適用範囲について
• 元々はTwitterのソーシャルグラフを解析する想定でした。
• しかしTwitterのソーシャルグラフをAPIで取得するのは困難と判明。
• あるアカウントのフォロワーを取得するAPIは1 callにつき5000人まで取得可能だが、そのAPIは15分に15回しか実行できない。
• 今回は商品グラフデータをダミーで用意して実施。
‹#›
8.Ikazuchi 実行中コンソール デモ
‹#›
Ikazuchi セットアップ
https://github.com/AKB428/ikazuchi_ol !https://github.com/AKB428/ikazuchi_rs !• 必要なサーバー、ソフトウェアはMikasaと同じ
• 商品グラフデータはAmazonAPIなどオープン系のプロダクトAPIを使い「あなたにお勧め」商品を紐付けるか、自社のユーザー購買履歴から構築。
‹#›
8. Spark GraphXについて
• Sparkでグラフデータを解析するサブシステム
• グラフデータを解析できるがコードは直感的ではない
• またあまり開発も盛り上がっておらず、Spark1.4では唯一更新がないサブシステム
https://spark.apache.org/releases/spark-release-1-4-0.html • Spark Packageにアドオンが唯一ない
http://spark-packages.org/ ・オライリーの「Lerning Spark」にもサブシステムで唯一解説がない。
‹#›
8. Spark GraphXについて
グラフを自前で処理するコードは直感的ではないが実装されているアルゴリズム(例えばページランクアルゴリズム)は使用しやすく数行で利用できる。
http://qiita.com/AKB428/items/bf1cd05d6cf3e23986d9
‹#›
val graph: Graph[Int, Int] = GraphLoader.edgeListFile(sc, args(0)).cache() val ranks = graph.pageRank(0.0001).vertices val users = sc.textFile(args(1)).map { line => val fields = line.split(",") (fields(0).toLong, fields(1)) } val ranksByUsername = users.join(ranks).map { case (id, (username, rank)) => (username, rank) } println(ranksByUsername.collect().mkString("\n"))
‹#›
8. Spark GraphXについて
GpaphXが需要がない理由は以下が考えられる
• RDBからグラフデータ処理への頭の変換のコスト
• そもそもグラフデータを持っている企業が少ない
• グラフデータをオープンで公開してる企業が少ない
• 現実の問題に適用しにくい、RDB・表概念で事たりている。
• GraphXが活性化するにはページランクアルゴリズム並に簡単に使えるライブラリの充実が不可欠。
!
‹#›
• 9. 参考文献紹介-1
!!!!「Scala逆引きレシピ」
• 他言語経験者でScalaが初心者の方にお奨め、情報も新しく、PlayフレームワークやSBTの説明も豊富。
‹#›
• 9. 参考文献紹介-2
!!!!「Learning Spark」
• Sparkのコーディングはこれを読めば理解可能。
• 英語初心者でもかなり読みやすい本なのでお奨め。今年日本語化されるらしい。
‹#›
• 10. まとめ
• Twitterストリームのリアルタイムな集計にSpark Streamingは最適だった。(SQLだとデータを一度DBに格納し日付系の長いSQLを打つ必要がある。)
• 日本語データを解析するためには形態素解析ライブラリの使い方の把握、ユーザー辞書のチューニング、データクレンジングが重要で、ある程度は時間がかかる。
• Spark GpaphXは対象となるグラフデータを持っていないとグラフデータの構築から準備するコストが発生。
‹#›
研究に2週間の時間を頂きました。チームの皆様、ご協力本当に ありがとうございました。
素晴らしい試みなので続けていきたいと思います。
‹#›
ご清聴ありがとうございました