🌊

2022年のSnowflakeリリースノートを読んで1年を振り返る

2022/12/09に公開

本記事は、 Snowflake Advent Calendar 2022 の 3 日目です。


Snowflake Data Superhero の菱沼です。
2022年はどんな年でしたか?

Snowflakeはクラウドネイティブなデータウェアハウス製品としてはすでに枯れており、基本的な機能はすべて揃っている感じがします。

例えば基本的な機能の例としては次のようなものがあります

  • コンピューティングとストレージの分離
  • 標準SQLのサポート
  • 列レベル、行レベルでのマスキング、ポリシースタイルの動的なマスキング
  • RBACな権限制御、SAMLやSCIMとの統合
  • クラウドプラットフォームを跨いだ統合

そんな枯れているはずのSnowflakeですが、2022年もたくさんの機能がリリースされました。

2022年にどんな機能をリリース(主にパブリックプレビュー、GA)してきたかを、リリースノートを振り返って、来年がどんな年になるのか思いを馳せていきましょう。

リリースノート:https://docs.snowflake.com/ja/release-notes.html

開発系の機能

この2022年でSnowflakeは開発系の機能が強化されました。
主なものに、「Snowpark」、「UDFs/UDTFs」、「Snowflakeスクリプト」があります。

Snowpark

Snowparkは2021年にScala対応があり、2022年にJavaのGA(5月)、PythonのGA(11月)と、段階を経てリリースされてきました。
プレビューだった期間が長かったこともあり、すでに使われている人も多いかなと思います。
SnowparkはSparkライクなインターフェースを持った各言語のライブラリで、ライブラリとSnowflakeの間はSQLをやりとりする実装になっています。
Snowparkを使えば、JupyterやColaboratoryなどのNotebookから、Snowflakeに対して簡単に対話的な実装を行うことができます。

また、SnowparkのGAと同時に各言語(Scala、Java、Python)を用いたストアドプロシージャでもSnowparkが使えるようになりました。
これによってローカルのNotebookで開発したSnowparkのコードを、ストアドプロシージャとしてデプロイして、データパイプラインの一部として利用できます。

このように、SnowparkはSnowflakeを取り巻く開発環境の変化として、2022年でのもっとも大きなものだったかなと思います。
参考ドキュメント: https://docs.snowflake.com/ja/developer-guide/snowpark/index.html

UDFs/UDTFs

UDFsはユーザ定義関数、UDTFsはユーザ定義テーブル関数です。
2022年になってUDFs/UDTFsがサポートする言語は2倍に増えました。
以前は、SQLとJavaScriptの2つだけがサポートされていましたが、そこにJavaとPythonが加わり4つになりました。

Java UDFs/UDTFsは現時点でGCPのみプレビューですが、Python UDFs/UDTFsはすでに全プラットフォームでGAされています。

プレビュー、GAされたスケジュール

  • Java UDFs/UDTFs
    • 1月 UDFsがAWSにてGA
    • 2月 UDTFsがAWSにてGA
    • 5月 AzureにてGA
    • 12月時点ではGCPではプレビュー
  • Python UDFs/UDTFs
    • 6月 プレビュー
    • 11月 GA

また、Java UDFsでは非構造化データ向けの機能が4月にプレビューとなり、InputStreamを使って、ステージ上のファイルを読み込みできるようになりました。
参考ドキュメント: https://docs.snowflake.com/ja/user-guide/unstructured-data-java.html

これによって、PDFから文章を抽出したり、画像ファイル内の物体検出結果をSnowflakeへ保存したりするのが楽になりました。
PDFからテキスト抽出する例:https://datumstudio.jp/blog/0601_pdf-extract_snowflake/

Snowparkに比べるとセキュリティモデル的になかなかSnowflake側での実装が難易度が高そうなUDFs/UDTFs周りの機能ですが、来年には非構造化データ向けの機能も含めてすべてGAされることを願っています。
参考ドキュメント: https://docs.snowflake.com/ja/sql-reference/user-defined-functions.html

Python UDFのバッチAPI

Pythonで使えるUDFの機能としてバッチAPIというものがあり、11月にGAされました。
これは入力をpandasデータフレーム、出力もpandasデータフレームとするPython UDFの機能です。
データフレームという複数行の塊を処理するため、処理性能の向上が見込めます。
ぜひ積極的に活用チャレンジをしてみてください。
参考ドキュメント: https://docs.snowflake.com/ja/developer-guide/udf/python/udf-python-batch.html

Snowflakeスクリプト

Snowflakeスクリプトは1月にプレビューが開始され、5月にGAされました。
機能としてはOracleのPL/SQLのようなスクリプト言語で、DB上でSQLを手続き的に走らせたいときに重宝します。
便利なSnowflakeスクリプトですが、一点注意点としては、SnowSQLとクラシックウェブインターフェースでは記法に制限がありますので、SnowSightから使うのがおすすめです。
また、11月にリリースされたストアドプロシージャからのメール通知と組み合わせることで、例外の通知も簡単にできるようになりました。
Snowflakeスクリプトが登場したことで、ユーティリティ的な機能開発は、ストアドプロシージャやUDFで実装し、それらを利用する手続き的な実装はSnowflakeスクリプトやタスクと棲み分けできるようになりました。
スケジューラなどで自動実行しない人の手で実行する運用系のプログラムはSnowflakeスクリプトは、Pythonなどで書くよりもライブラリのメンテナンスコストが発生しないので、向いているかもしれません。
ぜひ選択肢の一つとしてご検討ください。

参考ドキュメント: https://docs.snowflake.com/ja/developer-guide/snowflake-scripting/index.html

その他の開発系機能

上記以外に今年リリースされた主な開発系の機能としては下記のようなものがあります。

  • 1月 非構造化データサポート GA
  • 2月 Snowflake SQL API(v2) GA
  • 8月 GEOMETRYデータ型 プレビュー
  • 10月 匿名プロシージャ プレビュー
  • 11月 ストアドプロシージャのメール通知 プレビュー、外部関数のトランスレーターがGA

なにげに、Snowflake SQL APIがv1(無印)を捨てて、v2のみGAしてきたのには驚きましたね。

参考ドキュメント:https://docs.snowflake.com/ja/developer-guide/sql-api/index.html

データガバナンス

データウェアハウス製品で最も大事な機能領域の一つにデータガバナンスがあります。
ただどうしても要件が多岐に及び、各製品ごとに備えている機能はまちまちで、データウェアハウス製品選定時のキーとなることが多くあります。
最近はデータガバナンス系のSaaSも増え、そちらで要件を満たすこともあるかなと思いつつ、Snowflakeが2022年にどんなデータガバナンス機能をリリースしてきたのか見ていきましょう。

主な機能リリース

  • 1月 条件付き列を使用したマスキングポリシーGA
  • 2月 データ分類がプレビュー、オブジェクトの依存関係がプレビュー
  • 3月 オブジェクトタギングにパイプオブジェクトをサポート
  • 4月 オブジェクトの依存関係がGA
  • 6月 タグベースのマスキングポリシーがプレビュー、データ分類がAWSをAzureでGA
  • 8月 マスキングポリシー、行アクセスポリシーにIS_ROLE_IN_SESSIONのサポート
  • 9月 データ分類がGCPでGA
  • 10月 タグベースのマスキングポリシーがGA

大きなところでは、タグベースのマスキングポリシーとデータ分類でしょうか。
マスキングポリシー系は2021年まではなかなか大味な印象のある機能でしたが、2022年には細かく機能が増え、代替の要件に対応できるようになったかなと思います。
タグベースのマスキングポリシーが登場したことで、メンテナンス方針レベルでベストプラクティスが変わり、開発や運用を行っていた開発者の人は大変だったんじゃないでしょうか?
また、上記のリリースには書いていませんが、9月にはクロスデータベース、クロススキーマなポリシーが無効になる変更もあり、一部のプロジェクトでは悲鳴が上がったりとかも…

このようにデータガバナンス系の機能は活発に開発が進められ、来年も目が離せない領域です。

参考ドキュメント(タグベースのマスキングポリシー):https://docs.snowflake.com/ja/user-guide/tag-based-masking-policies.html
参考ドキュメント(データ分類): https://docs.snowflake.com/ja/user-guide/governance-classify.html

アクセス履歴の強化

アクセス履歴というデータガバナンス用のビューがありますが、2022年は周辺機能のアップデートに追従するように強化されました。

  • 4月 書き込み操作への対応、TRUNCATE TABLEへの対応
  • 8月 コンシュマーアカウントでの共有オブジェクトへのアクセスへ対応
  • 10月 列系統のサポートがプレビュー
  • 11月 UDFsとストアドプロシージャへの対応

また、1月にはSnowsight にはコピー履歴のダッシュボードが追加されるなどUI的な改善もありました。

新リージョン

2022年には6リージョンが追加されました。
その中でも7月に追加された大阪リージョンによって、日本国内に完結した、アカウントレベルのDRが可能になりました。
さらに同じく2022年にリリースされた、アカウントレベルの複製やクライアント接続のリダイレクトを使うことで、高レベルなDRが手軽に実現できるようになりました。

  • AWS
    • アジア太平洋(大阪) 7月
    • 南米(サンパウロ) 7月
  • Azure
    • UAE 北部(ドバイ) 2月
    • 南中央 US (テキサス) 4月
    • インド中部(プネー) 6月
  • GCP
    • US 東部4(北部バージニア) 7月

日本ではソシャゲが流行った経緯からGCPでのBigQueryユーザが多く、SnowflakeのGCP東京リージョン対応が以前から要望が出ているようですが、今年の新リージョンのペースを見てもそこまでGCP対応が早く進むイメージは持てなさそうなので、GCP採用時は安心してBigQueryを使っていくことになりそうです。

データロード

データウェアハウスが多様なデータロード手法を持つことは、非常に重要で、Snowflakeにも複数の手段が備わっています。
今年はSnowpipeの機能リリースがいくつか有りました。

  • 1月 AWSプラットフォームでのエラー通知のプレビュー
  • 2月 GCSでイベントを通知を利用した自動ロードがGA
  • 6月 Azure,GCPでのエラー通知のプレビュー
  • 6月 非Snowpipe所有者がREST APIでSnowpipeを起動できるように
  • 9月 パターンマッチングのサポート

エラー通知がない時代は、履歴のビューを定期的に監視して、エラーをハンドリングしていましたが、通知が飛ぶことで、運用が楽になりましたね。
また、Snowpipe側でパターンマッチングができるようになったことで、Snowpipe側、オブジェクトストレージ側のどちらでもパターンマッチングできるようになり、選択肢が広がりました。
オブジェクトストレージ側で実装して、コードの見通しが悪くなるなどを懸念する場合はSnowpipe側で実装するとよいのではないでしょうか?

参考ドキュメント: https://docs.snowflake.com/ja/user-guide/data-load-snowpipe.html

列定義検出

データロード周りの実装に大きく影響を与えた機能リリースとして、忘れてはいけないのが列定義検出です。
これは半構造化データのうちファイル自身が列定義を持ったファイルフォーマット(例えばParquet、Avro、ORC)をロードする際に、列定義を検出し、それを利用してデータロードを可能にする機能です。
この機能が出るまでは、ロード用のテーブル列とのマッピングを決め打ちする必要があり、上流のテーブル定義変更に対して柔軟性が低い状態でした。

パブリックプレビューにはなっていませんが、イベントなどで言及があったように、スキーマ進化と呼ばれる機能が準備中で、今後も列定義検出周りの機能は要注目です。

参考ドキュメント: https://docs.snowflake.com/ja/user-guide/data-load-overview.html#detection-of-column-definitions-in-staged-semi-structured-data-files

データパイプライン

主にロード後のELTの機能として、Snowflakeはタスクはストリームなどの機能を備えています。
2022年もいくつかの機能がりりーされました。

  • 2月 タスクの手動実行がプレビュー
  • 3月 ビューを用いたストリームがプレビュー
  • 5月 AWSでタスクのエラー通知がプレビュー
  • 6月 タスクのDAG(有向非巡回グラフ)がプレビュー
  • 8月 単一SQLで複数の先行タスクのサポート(DAG用の機能)
  • 9月 タスクのDAGがGA、サーバレスタスクがGA、タスク実行に指定回数失敗した際に中断する機能が追加、タスクパラメータ設定が拡張
  • 10月 タスクの手動実行がGA、AWSでタスクのエラー通知がGA

タスクが手動実行できるようになったため、リバッチや、バックフィルが楽になりました。
またついにサーバレスタスクがGAされ、安心して使えるようになりました。
さらにタスクの管理方針レベルでの変更としてDAGがサポートされるようになり、複数のタスクの終了を待って実行する、いわゆるワークフローを構築できるようになりました。
さらにエラー通知も強化されたので、ちょっとしたジョブ管理やワークフローをSnowflakeで完結させることができるようになってきました。

他にもあまり目立っていませんが、ビューを用いたストリームがプレビューになり、イベント型でサーバレスなデータパイプラインの構築の選択肢が増えています。

参考ドキュメント(タスク): https://docs.snowflake.com/ja/user-guide/tasks-intro.html
参考ドキュメント(ストリーム): https://docs.snowflake.com/ja/user-guide/streams.html

データレイク

データレイク系の機能はもうかなり枯れており、少ししか機能は増えませんでした。
大きなものとしては、2月にプレビューになった外部テーブルのDelta Lakeサポートです。
Delta LakeはDatabricksなどでよく使われるフォーマットで、これによって、DatabricksとSnowflakeの統合性が高まりました。

その他、細かいものとしてGoogle Pub/Subを使用したメタデータを自動的に更新や、前述のJava UDFsを使った非構造化データの処理がリリースされました。

参考ドキュメント(Delta Lakeサポート):https://docs.snowflake.com/ja/user-guide/tables-external-intro.html#delta-lake-support

仮想ウェアハウス

今年もウェアハウスはいくつかの機能がリリースされました。Snowflakeの根幹をなすコンピューティングユニットの仮想ウェアハウスですが、まだまだ活発に開発が続いているようです。

  • 3月 待機時間と同時実行性の改善がGA
  • 5月 Query Accelerationサービスがプレビュー
  • 6月 DML遅延の改善、5XL・6XLのプレビュー
  • 10月 5XL・6XLのGA
  • 11月 Snowpark用ウェアハウスのプレビュー

驚いたのが、3月、6月の性能向上でした。
現時点でも十分高速な上に、高速化すればSnowflakeの売上が下がりうるので、よくある会社組織ではこういった機能は開発優先順位が下がりそうなものなのに、まだまだ改善リリースを出してきます。
とはいえ、これまでもリリースノートに載らない性能改善はたくさんありましたので、今後も待っていれば勝手に費用が安くなっていくSnowflakeに期待が持てます。

11月にはSnowpark用のハイメモリインスタンスがプレビューになり、これを見た私は仮想ウェアハウスの裏側の実装の柔軟さが滲み出ていてワクワクしました。

参考ドキュメント:https://docs.snowflake.com/ja/user-guide/warehouses.html

まとめ

さて、リリースノートを読んで振り返り、その中から、主だった機能を取り上げてみました。

この中で一番良かったのはどれだと言われると、個人的にはまだプレビュー段階のJava UDFsを使った非構造化データの処理機能だったりします。
Python版はプライベートプレビューだと聞いていますが、こちらにも期待しつつ、いつか非構造化データを気軽にSnowflake上の機械学習パイプラインで回せるようになると良いなと思っています。

今年もたくさんの機能が実装されました、来年はもっとたくさんの機能が実装されることを願って、この時期を終わりたいと思います。
皆さん良いお年を〜。

Snowflake Data Heroes

Discussion