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

デイリーレコード数2億超え! 大規模ゲームサービスに Snowflakeを導入したお話

伊藤寛起
December 04, 2020

デイリーレコード数2億超え! 大規模ゲームサービスに Snowflakeを導入したお話

Data Engineering Study #5「噂のSnowflake Deep Dive」の登壇資料です。

https://forkwell.connpass.com/event/194269/

伊藤寛起

December 04, 2020
Tweet

Other Decks in Technology

Transcript

  1. 導入してみた人
 伊藤 寛起 (いとう ひろき) 株式会社Colorful Palette / エンジニアリングマネージャー -

    主にJavaでゲームAPI作ってる人 - クラウドは専らAWS, BigQueryを使いたいが為にGCPを少々 - アプリ/インフラで云うと6:4くらい
  2. ウェアハウス・ロールの設計
 ウェアハウスは用途で分割
  ➡ コストレポートが見やすくコスト最適化がしやすくなる 
 
 
 
 
 


    
 
 
 
 ロールは職種で分割
  ➡ やることが職種で別れていたので権限管理がしやすかった 

  3. 運用してみた人
 安部 永 (あべ はるか) 株式会社Colorful Palette / サーバサイドエンジニア -

    20新卒 - ログ基盤の実装やアプリの実装を担当 - アプリ/インフラで云うと5:5くらい
  4. ColorfulPaletteのログ分析基盤
 EC2
 (アプリサーバ)
 Aurora
 (DB)
 S3
 Kinesis Firehose
 追記型データ (ログなど)

    
 分析担当
 更新型データ
 (マスタ,ユーザ登録情報など) 
 非定常データ
 (アンケートデータなど) 
 Lambda
 (バッチ)
 アップロード
 S3にjson形式で集約

  5. ColorfulPaletteのログ分析基盤
 S3
 Kinesis Firehose
 追記型データ (ログなど) 
 更新型データ
 (マスタ,ユーザ登録情報など) 


    分析担当
 非定常データ
 (アンケートデータなど) 
 Lambda
 (バッチ)
 Snowpipe
 EC2
 (管理画面)
 アップロード
 オンライン更新 (追記型データ)
 オフライン更新 or 外 部テーブル
 (追記型データ以外) 
 EC2
 (アプリサーバ)
 Aurora
 (DB)

  6. 運用時トラブルの事例共有 ①
 Snowpipeでのデータ取り込み時の欠損 (不正行のあるJsonの取り込み) 
 
 → 不正行以降のログが取り込まれない
 正常な例
 {"Id":1,"type":"item"}


    不正な例 (途中で改行) 
 {"Id":1,"type":
 "item"}
 解決策
 COPY文で指定するフォーマットをjsonではなくCSVにする
 & on_error = CONTINUE パラメータを指定
 

  7. 運用時トラブルの事例共有 ②
 Json形式データ使用時のフルスキャン
 元々のテーブル定義:
 
 
 
 
 
 =>

    各レコードがJsonの一行に対応するテーブル構造
   (適当に入れておいても良い感じに
    パーティションしてくれるだろうという考え)
 

  8. 元々のテーブル定義:
 
 
 
 
 
 => 各レコードがJsonの一行に対応するテーブル構造
 
 =>

    約950MBのデータに対して特定の属性を 
   検索した際に936.2MBのスキャンが発生
   (ほぼフルスキャン,コストも結構かかってしまっていた)
 
 運用時トラブルの事例共有 ②
 Json形式データ使用時のフルスキャン
 

  9. 運用時トラブルの事例共有 ②
 Json形式データ使用時のフルスキャン
 
 解決策:Jsonをパースして取り込む + クラスタリングキーを指定
 
                +

    cluster by (activityType)
 
 
 パース済み
 生データ
 スキャン量
 13.7MB
 936.2MB
 行動タイプのカラム (where句に指定) 

  10. 運用時トラブルの事例共有 ②
 Json形式データ使用時のフルスキャン
 
 解決策:Jsonをパースして取り込む + クラスタリングキーを指定
 
                +

    cluster by (activityType)
 
 
 
 パース済み
 生データ
 スキャン量
 13.7MB
 936.2MB
 クラスタリングキーのチューニング が大切
 1. where句に指定されるカラム
 2. カーディナリティの”低め”なカラム 
 行動タイプのカラム (where句に指定) 

  11. Snowpipe便利!一方,つまずきポイントも...
 
 ワークシートの使い勝手が良い!
 
 
 Snowflake独自の仕様
 - PK / NOT

    NULL制約が効かない 
 - BigQueryに慣れてると戸惑うかもしれない (関数とか) 
 
 脳死でコストが下がるかというとそうでもない
 - クラスタリングキーのチューニングなどは依然必要 
 
 
 運用してみた所感

  12. 1部2部まとめ
 - Snowflake導入して良かったとこ
 - 手厚いサポート
 - Snowpipe,ワークシートなどの便利な機能
 - 膨大なデータ量に対してもスケーラブル
 


    - 導入時に一考の余地あり
 - Snowflake独自の仕様はそこそこある
 - ドキュメント読む or 都度サポートに相談
 - 設計が重要
 - ウェアハウスやログ,テーブル,ロール...
 - コストに大きく影響
 

  13. 1部2部まとめ
 
 - Snowflake導入して良かったとこ
 - 手厚いサポート
 - Snowpipe,ワークシートなどの便利な機能
 - 膨大なデータ量に対してもスケーラブル


    
 - 導入時に一考の余地あり
 - Snowflake独自の仕様はそこそこある
 - ドキュメント読む or 都度サポートに相談
 - 設計が重要
 - ウェアハウスやログ,テーブル,ロール...
 - コストに大きく影響
 
 結論:大規模ゲームサービスでも問題なく運用できてます!