/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2023/08/18 読んだ記事まとめ(Snowflake コスト削減/最適化/Iceberg連携)

お盆休みをしっかりいただけたので、徐々に通常運転に戻すべく今日は Snowflake 絡みの記事を3つ取り上げてみます。

Best practices to optimize Snowflake spend

medium.com

Snowflake のコストが高いと最近耳にしますが、便利で高性能なサービスがゆえに利用目的などを精査していない結果、仮想ウェアハウスの利用金額が高くなってしまったり(Tableau などの BI サービスから接続するときに顕著?)、Snowflake が用意する様々な機能を知らずに損をしている、ということがある気がしています。

上記記事は Snowflake のプロダクトマネージャによる投稿で、Snowflake のコストを最適化するためのノウハウが紹介されています。ノウハウといっても基本的なもので、以下の4ステップに分けて具体的な方法が紹介されていました:

  1. コストの可視化を行い、各部門やチームへの費用按分を決定する
  2. 予算に対してのアラートを設定する
  3. RoI に基づいたワークロードの分割を行う
  4. リソースを大きく消費する行動を制限する

コストの可視化については Snowflake はすでにダッシュボードを用意していますし、それで足らなければコストに関する様々なビューが提供されています。最近では Streamlit と連携して、Snowflake のデータを使ったダッシュボードが Python で簡単に構築できるようになりました。

3, 4番目は Snowflake の機能紹介の色が強い気がしましたが(自動クラスタリング, Query Acceleration Service, 検索最適化サービス, マテリアライズドビュー)、こういった機能を闇雲に使うのではなく、RoI を加味して使い分けたり、必要であればアーキテクチャ再構築も実施するべきとも書かれていました。

パフォーマンス改善の役に立つ 知っていてほしい Snowflake の仕様 2 選

speakerdeck.com

こちらは以前同僚に教えていただいた Snowflake のパフォーマンス改善に関するスライドです。カラム数とパーティションを読み込むサーバの特性について検証を交えながら紹介されています。

特にカラムに関して、100列と10000列によるパフォーマンス差異が検証されていました。実際には各環境/データで検証するべきでしょうが、メタデータ読み込みのオーバーヘッドが顕著になるカラム数の目安を知ることができます。

When To Use Iceberg Tables in Snowflake

medium.com

2023年の Snowflake Summit で、Iceberg フォーマットの連携が強化されると発表がありました(現在はプライベートプレビュー)。公式発表によると、外部テーブルとして Parquet データを読むよりも外部の Iceberg テーブルを読む方が早く、さらに Snowflake 管理の Iceberg テーブルはネイティブフォーマットと同等のパフォーマンスが得られるとのことです。

Iceberg フォーマット自体の解説も上記記事で紹介されていますが、誤解を恐れずに一言で言えばACID特性を持たせて更新可能にした Parquet フォーマットです。

これで Snowflakeで扱えるフォーマットは以下の4種類になりました:

  • ネイティブ: 多くの場合、最適なフォーマット
  • Snowflake 管理の Iceberg フォーマット: Snowflake のデータを外部ツールから読み込む場合など
  • Snowflake 非管理の Iceberg フォーマット: AWS Glue など、外部のETLツールが生成したデータを Snowflake 上で利用する場合など
  • 外部テーブル: CSVファイルなど外部にホストされているデータを読む場合にのみ利用

この Iceberg 連携により、オープンフォーマットでデータを管理したい場合でも Snowflake を利用する選択肢が増えました。Iceberg フォーマットでデータを(例えば S3 に)一元管理しておくことで、データの重複を防ぐことはできそうです。その場合 アーキテクチャ的に Athena と重複しそうですが、Snowflake には Snowpark などの機械学習向けの機能などもありますし、ユースケースを整理した上で、用途によってクエリレイヤを使い分けるのも一案かもしれません。