Slide 1

Slide 1 text

ストリーム処理で Akka Schedulerを活用してみた話 株式会社 MicroAd 松宮 康二 1

Slide 2

Slide 2 text

自己紹介 ● 社会人もうすぐ3年目 ● インターネット広告の配信システムを作ってます ○ いわゆるアドテクという業界 ● 主にScalaを書いてます ○ 1.5年くらい ● 会社ではスクラムマスターという 役割を担っています. ● たまにQiitaに記事を書いてます ○ https://qiita.com/mattsu6 ● 最近はSparkを使ってます 2

Slide 3

Slide 3 text

今日のテーマ ストリーム処理(Spark Streaming)で Akka Schedulerを活用してみた! 3

Slide 4

Slide 4 text

そもそもストリーム処理って? ● 無限に生成され続けるデータをリアルタイムに処理し続けること ● メッセージキューやログ収集ツールがインプットになる ● Spark Streamingとは並列分散処理 + ストリーム処理を組合せた処理基盤 http://mogile.web.fc2.com/spark/spark200/streaming-programming-guide.html 4

Slide 5

Slide 5 text

背景 ● とあるお仕事が舞い込んできた ● 「色んなサイトのアクセスログをリアルタイムに分析したい!」 ● アクセスログは大量に発生するのでパフォーマンス要件はシビア ○ 数万QPSが要求される... (ºДº)マジカッ!! ● アクセスログには色んな付加情報が必要 ○ 様々なデータベースとやり取りする必要がある 色々検討した結果Spark Streamingによるストリーム処理を採用 しかしデータベースとのやり取りがボトルネックに... 5

Slide 6

Slide 6 text

データベースとのやり取りがボトルネックに ● 各プロセスが1レコード毎にDBと通信するのは流石に効率が悪い! ○ 軽いクエリしか投げないか性能要件が厳しくなければこの構成でも良いけど・・ ドライバ エグゼキュータ エグゼキュータ エグゼキュータ データベース アクセス ログ アクセス ログ アクセス ログ アクセス ログ Sparkに取り 込んでいく 出力 重いクエリが 足を引っ張る 6 エントリポイント アプリの制御 実際に処理する プロセス

Slide 7

Slide 7 text

全部メモリに載せちゃえ ● 予め必要なデータを全部メモリに載せる ● Sparkでは起動時に値をブロードキャストする機能がある ● しかしデータベースの値は時々刻々と変化するため更新したい! ドライバ エグゼキュータ エグゼキュータ エグゼキュータ データベース アクセス ログ アクセス ログ アクセス ログ アクセス ログ 出力 1. 起動時に ロード 2. 各エグゼキュータに ブロードキャスト 値の更新はどうやってやるか? 7

Slide 8

Slide 8 text

Akka Schedulerを使ってみる(1/2) ● 値の更新をストリーム処理とは分離したい (非同期に更新したい) ● そこでドライバ内にアクターシステムを生成してみた ドライバ エグゼキュータ エグゼキュータ エグゼキュータ データベース ActorSystem 更新 アクター Scheduler 定期的に メッセージ 送信 8

Slide 9

Slide 9 text

Akka Schedulerを使ってみる(2/2) ● 値の更新時に整合性を保つために古いデータは残す必要があるが いらなくなったタイミングで消してあげる ドライバ エグゼキュータ エグゼキュータ エグゼキュータ データベース ActorSystem 更新 アクター Scheduler 削除 アクター エグゼキュータが参照しな くなった古いデータを削除 するアクターを追加 古いデータを 削除 9

Slide 10

Slide 10 text

ボトルネックの解消に成功 ● エグゼキュータはDBと一切通信しないため,高速に処理できるように! ● 当初の性能要件は満たせた! ○ 具体的な数字はお見せ出来ませんが ... ○ 性能が足りないと下記のグラフがどこかで頭打ちになってるように見える 10

Slide 11

Slide 11 text

おわりに ● ストリーム処理とAkka Schedulerを組み合わせて通信コストを改善した ○ 詳しくはhttps://qiita.com/mattsu6/items/e6817ba2d2f79d1efe09 にまとめてます! ● 今までJavaのTimerやExecutorsを利用してスケジューラを実装していたが,アク ターモデルを利用する方が機能を疎結合にしやすく実装しやすい感じがした ● アクターモデル楽しい ● Akka実践バイブルはまだ6章くらいまでしか読めてない・・もっと知りたい ● 会社にScala使う人がほとんどいないので寂しい・・・ 11