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

広告配信プロダクトのSnowflakeへの移行

Kurochan
November 25, 2020

 広告配信プロダクトのSnowflakeへの移行

SnowflakeのDATA CLOUD SUMMIT 2020で登壇したものです
https://snowflake.events.cube365.net/snowflake/summit-2020-ja/content/Videos/H7PMNwk7Ru2xCYFsY

Kurochan

November 25, 2020
Tweet

More Decks by Kurochan

Other Decks in Technology

Transcript

  1. 黒崎 優太 • 株式会社サイバーエージェント
 Dynalyst 開発責任者 • 業務は Scala +

    AWSが中⼼ • イラスト図解でよくわかる ITインフラの基礎知識 •書きました • ⾃宅サーバなどが好きです @kuro_m @kurochan
  2. 開発しているシステム概況 • ⼊札リクエスト量: 数⼗万リクエスト / 秒 数千億リクエスト/⽉ • ⼊札トラフィック: 約8Gbps

    • レスポンスタイム: 100ms以内 • ログの量: 数TB / Day(圧縮状態) • ALL AWS ೔ຊͷೖࡳϦΫΤετඵ ೔ຊΞϝϦΧͷϨεϙϯελΠϜ NTFD
  3. ログのローテーションのしやすさ • TBくらいのテーブルに対して2TB分くらいの削除をした • DELETE FROM table WHARE logged_at >=

    ... • 数秒でクエリが終了した • メタデータ更新のみで、バックグラウンドで削除が⾏われるようで、
 ⼤量のデータの削除が楽 • ⼀定期間経過するとexpireするような機能もあるとさらに嬉しいところ。。
  4. コスト • RedshiftからSnowflakeに移⾏するにあたって、
 コストが上がることは避けたい • Redshiftは1〜3年のリザーブドインスタンスを購⼊するのが⼀般的 • あらかじめコンピュートリソースを買い切る要素が強い, Redshift Spectrumは従量課⾦

    • Snowflakeは従量課⾦の要素が強い • ウェアハウスが従量課⾦でコストの⼤半を占める • Redshiftのクエリログのテーブルを集計することでクエリの頻度や量を概算 • ⼈間以外が投げるクエリ(バッチ処理, Tableauなど)が多く⾒直しの必要性があることがわかった • 結論: クエリを投げるタイミングを集中させてウェアハウスの利⽤効率を
 上げたり、クエリの頻度を⾒直したりする必要がある • 結果的にコストは下がった
  5. データ転送料 • AWSではInboundトラフィックは無料、Outboundトラフィックは有料 • AWS上で⼤量のデータを扱うプロダクトにとって外部のサービスを使う上で データ転送量が問題になりがち • 例: 東京リージョンからインターネットに1⽇5TB転送: 約

    $9,000/⽉ • Snowflakeはクラウド事業者とリージョンが選べるので、同⼀リージョン内の 通信にすることができる • AWS TokyoリージョンのS からSnowflakeに
 転送する料⾦は無料(S のAPI料⾦は発⽣) • 結論: 問題ない
  6. 運⽤のしやすさ • クラスタのバージョンアップ作業などが不要(基本的にダウンタイムがない) • 異常に重いクエリを投げてしまっても他のウェアハウスに影響が出ない • Virtual Warehouseを⽤途ごとに分ければよい • ほぼすべての設定がSQLからも操作できて統⼀感がある

    • Web UIが充実しており、設定項⽬の確認も楽 • MySQLやPostgreSQLプロトコルが使えないのは⽋点 • Web UIが充実している • アダプタやインテグレーションが充実している • 結論: 問題なし(運⽤負荷は軽減した)
  7. セキュリティ⾯ • おもにSnowflakeへの各種アプリケーションからのアクセス⽅法 • Snowflakeはインターネットに公開される前提で認証/認可や通信が暗号化され ているため、どこからでもアクセスができ楽になった • 以前はVPN経由でしかDWHにアクセスできなかった • IPアドレス制限やAWS

    Private Linkによるインターネットを経由しない通信も可能 • PostgreSQLプロトコルなどオープンなプロトコルが利⽤できない代わりに、
 「ゼロトラスト」な環境になった • 結論: 問題なし(運⽤負荷は軽減した)
  8. クエリの互換性 • Redshiftで使っていたクエリをできるだけそのまま使いたい • アプリケーションから接続するドライバ • JDBCドライバが提供されているのでドライバの差し替えと設定項⽬の変更で補う • IPアドレスをパースして正規化できるような関数など、Snowflakeの⽅が便利な関 数も⾒つかった

    • 結論: おおよそ問題ないが、⼀部書き換えが必要な部分があった • 今回の移⾏では機能的に不⾜しているケースはなかった • 移⾏前と移⾏後で同じ結果が返ってくるか確認する必要がある • 具体的に対処した部分については後述
  9. DB作成〜データのimportまで • create database • AWSのIAM Role作成 • S インテグレーション作成

    • AWS IAM Roleの信頼関係の更新 • ログフォーマット作成 • External Stageの作成 • テーブル作成 • テーブルへS からデータをinsert
  10. クエリの互換性を保つための修正 • 整数どうしの除算が⼩数で返る • 1 / 100が0ではなく、0.01になる • 整数も⼩数もnumber型で統⼀されているためこうなると思われる •

    floor関数で切り落とすことで互換性を維持 • random()関数が0〜1の範囲外の値を返す • uniform( . , . , random())で0〜1の範囲に丸める • snowsql(cli)にて • empty_for_null_in_tsv=true を指定しないと
 nullが空⽂字として出⼒されない • exit_on_error=true を指定しないとクエリ失敗時に
 コマンドの終了ステータスが成功になる
  11. Tableauの移⾏で困ったこと • Snowflakeのint型がTableauだと⼩数点つきで解釈されてしまう • 100, 200などが100.0, 200.0のようになり、別のDBとJOINできなくなる • Snowflakeのint型はnumber( ,

    )であり、最⼤桁数が⼤きいのが原因 • number( , )であれば問題が置きなかった • Snowflakeのテーブル定義のintを全てnumber( , )に置換することで解決 • 実⽤上number( , ) = 百京まであれば⼗分だった
  12. Apache SparkのSnowflake Driver • Apache Spark: クラスタコンピューティングフレームワーク • 集計はApache Sparkを使って256コア,

    512GB程度のクラスタで実⾏ • データソースとしてSnowflakeを使うことで集計対象のデータ抽出や簡単な
 前処理をSnowflakeに寄せることができる https://docs.snowflake.com/ja/user-guide/spark-connector-overview.html