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

『FINAL FANTASY VII EVER CRISIS』の運用を支えるデータ分析基盤【C...

CyberAgent
March 08, 2024
610

『FINAL FANTASY VII EVER CRISIS』の運用を支えるデータ分析基盤【CAGC2024】※2025年3月6日までの公開

アプリボットでは、複数のゲームタイトルにおけるKPI集計や、機械学習を用いた行動分析など、用途に応じたデータを収集・活用し、データドリブンで意思決定を行うための分析基盤を構築しています。
2019年よりAWS Athenaを用いた分析環境を構築し運用してきましたが、コストの増加やクエリ速度の問題などの課題も見えてきたため、より高速で低コストな分析環境の実現を目指しSnowflakeを用いた構成に変更を行いました。
Snowflake導入にあたってどの程度の効果が得られたのか、実際に運用を開始してみての所感も交え『FINAL FANTASY VII EVER CRISIS』の事例を元にお届けします。

https://cagc.cyberagent.co.jp/2024/session/index.html?id=Rs7UFP9g

© SQUARE ENIX Powered by Applibot, Inc. CHARACTER DESIGN: TETSUYA NOMURA / CHARACTER ILLUSTRATION: LISA FUJISE
Copyright © CyberAgent, Inc.

CyberAgent

March 08, 2024
Tweet

More Decks by CyberAgent

Transcript

  1. プロダクトチーム、データマイニング、データ分析基盤チーム 各チームが連携して分析を実施からプロダクト反映までを行う データ分析の体制について 5 データ分析基盤 チーム 行動ログの取得、 集計を担当 ・分析基盤の開発・運用 ・

    KPI定義・ログ設計 プロダクトチーム プロダクトの開発、 運用を行う ・プロダクトの開発 ・施策の実施 データマイニング チーム データを活用して 分析 ・収集したデータを活用 ・運用改善の提案 2名 2名 アプリボットのデータ分析
  2. FINAL FANTASY VII EVER CRISIS リリースに向けての目標 13 1. KPIのリアルタイムな可視化 ⇨

    売上、DAUなどは3分に1度更新できるように 2. 迅速な分析、調査が行えるパフォーマンスの実現 3. 旧 DIVE(Athena使用)のときよりも安価に 分析基盤「DIVE」
  3. ポイント1. 転送効率を上げるための工夫 定期取り込みログ(Stream2) ・Firehose バッファ設定 ┗ バッファサイズ:128MiB ┗ バッファ間隔:300秒 ・ServerlessTaskを用いた定期転送

    ┗ 実行スケジュールを指定可能 ┗ 実行間隔:300秒 ・対象データ ┗ 即時取り込み以外の全てのデータ 16 新・分析基盤「DIVE」
  4. Snowflake 導入 19 DIVE への導入にあたって ・ログファイルを DWH にロードする  ・アプリケーションから kinesis,

    Lambda などを経由して S3 に配置されている   ログファイルを Snowflake の DWH に定期的にロードする必要がある。 ・構築にかかる作業を旧 DIVE とほぼ同等のコストで実現する  ・ログテーブル数がかなり多いこともあり、DIVE では Athena で参照する Glue の   テーブル定義を独自ツールにより YAML から自動で生成している。   移行にあたって旧 DIVE と同様な構築コストで担保したい。
  5. Snowflake へのデータロード 22 継続的データロード ・Snowpipe  ・クラウドメッセージングもしくは、Snowpipe REST 呼び出しによって継続的かつ   バッチ実行と比較し、リアルタイム性の高いデータロードを行える ・Task

     ・単一のSQLや、ストアドプロシージャなど 任意の処理の実行が可能  ・スケジューリング設定も可能  ・まとめてコピーの実行が可能なためWHのコストを下げることが期待できる場面がある Snowpipe Task
  6. Snowflake へのデータロード 23 S3を使用した際の Snowpipe の構築 1. S3のファイル配置イベントのSNSトピックを作成 2. 自身のAWSアカウントへのアクセス権の付与

    3. 外部ステージ(S3)を Snowflake に作成 4. Snowpipe を構築 CREATE PIPE mypipe_s3 AUTO_INGEST = true AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket' AS COPY INTO snowpipe_db.public.mytable FROM @snowpipe_db.public.mystage FILE_FORMAT = (type = 'JSON'); Snowpipe 構築 SQL Amazon S3用Snowpipeの自動化
  7. Snowflake へのデータロード 24 定期 Task でのデータロード CREATE TASK mytask SCHEDULE

    = '60 MINUTE' TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24' AS COPY INTO snowpipe_db.public.mytable FROM @snowpipe_db.public.mystage FILE_FORMAT = (type = 'JSON'); S3を使用した場合のデータロード
  8. Snowflake へのデータロード 25 データロード手法の決定 ・ユーザー行動ログ  ⇨ 分析業務でリアルタイム性を高く要求する    ため Snowpipe

    を採用 ・DB更新ログ  ⇨ 行動ログと比較してリアルタイム性が    必要なかったため、コストメリットを取り    Task を採用
  9. 構築の簡略化 27 Athena(旧 DIVE)のテーブル構築 1. 独自ツールでパース可能な形式で yaml ファイルに記述する 2. 独自ツールを使用して

    aws-sdk により Glue に反映する この二つの手順しかなくシンプルだった ⇨ Snowflake に移行する場合も、同等程度の手順に収めたい definitions: sample: type: object description: サンプル properties: action_datetime: type: string format: date-time athena_type: timestamp description: ログ出力日時 user_id: type: integer format: int64 athena_type: bigint description: ユーザID yaml 定義の例
  10. 構築の簡略化 29 独自ツールの設計 ・YAML から Snowflake のリソースを構築するSQLを自動生成するツールに  ・Snowflake はほぼ全てのリソースが SQL

    にて操作可能   ・テーブルの作成、変更や、Snowpipe, Task の作成、変更などももちろん可能 ・生成した SQL は golang-migrate にて Snowflake に反映  ・テーブルの変更などは、ALTER 文などが必要なため反映順序などが重要だった  ・golang-migrate は snowflake driver も対応している  ・golang-migrate を使用するために、独自ツールはマイグレーションファイルを生成
  11. 構築の簡略化 30 ユーザー行動ログを定義した場合の生成例 definitions: schema_log: description: サンプル snowflake_table_type: schema version:

    1 properties: uuid: snowflake_type: string description: UUID user_id: snowflake_type: bigint description: ユーザID action_datetime: snowflake_type: timestamp description: ログ出力日時 CREATE TABLE schema_log(  action_datetime TIMESTAMP,  user_id BIGINT,  uuid STRING ); CREATE PIPE schema_log_pipe_v1 auto_ingest=TRUE ERROR_INTEGRATION = "${設定値}" aws_sns_topic = "${設定値}"" AS COPY INTO schema_log( action_datetime, user_id, uuid ) FROM ( SELECT TO_TIMESTAMP($1:action_datetime), $1:user_id, $1:uuid FROM @stage/schema_log/ ) PATTERN = ".*[-]v1$" FILE_FORMAT = (TYPE = 'JSON') on_error = continue; 10001_gen.up.sql 10001.yaml
  12. Athena(旧 DIVE)のテーブル構築 32 Snowflake(新 DIVE)のテーブル構築 1. 独自ツールでパース可能な形式で yaml ファイルに記述する 2.

    独自ツールを使用し SQL を生成 3. golang-migrate により SQL を反映 1. 独自ツールでパース可能な形式で yaml ファイルに記述する 2. 独自ツールを使用して aws-sdk に より Glue に反映する 手順は一つ増えたものの2→3の間には手作業は必要なく 自動で実行可能なためほぼ同等の手順で実現することが可能に 構築の簡略化
  13. Snowflake 導入 33 まとめ ・Snowpipe, Task を使用して、定期的にログを DWH にロードすることが可能になった ・Snowpipe,

    Task を要件に合わせ選定することで、コストを下げ導入した ・YAML ベースの独自ツールを作成することで、Snowflake 上のリソースの構築を簡略化  できた
  14. FINAL FANTASY VII EVER CRISIS リリース後 当初の目標を達成できたか? 35 1. KPIのリアルタイムな可視化

    ⇨ Snowpipeを用いての即時取り込みで毎分更新可能 2. 迅速な調査 / 分析を行えるパフォーマンスの実現 ⇨ 用途毎にウェアハウスを管理、調整することで   ストレスフリーなデータ活用 3. 旧 DIVE(Athena使用)のときよりも安価に ⇨ 後述 Snowflakeを使用してみて
  15. 41 まとめ FFVII EVER CRISIS では Snowflake の導入でコスト削減とパフォーマンス向上を実現 ⇨ マイクロパーティショニング等を自動で行なってくれるので

      デフォルトで非常に高速なクエリ実行 ⇨ Snowpipe, ServerlessTask を用途によって使い分けることでコストダウンを図った ⇨ 独自ツールを作成してSnowflake上のリソースの構築を簡略化 ⇨ 収集データのフル活用、より高度な分析にチャレンジすることが可能に