Snowflakeのサンプルデータベースから、大規模な(10TB~30TBかそれ以上ある)テーブルをFabricのパイプラインのコピーアクティビティで取り込む際に苦戦したので、備忘録としてそのエラーと解決策、原因をまとめました。
試行錯誤前のエラー
コピーアクティビティの設定値
実行結果詳細
エラーメッセージ
ErrorCode=SnowflakeExportCopyCommandOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Snowflake Export Copy Command operation failed,Source=Microsoft.DataTransfer.Connectors.Snowflake,''Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Failed to execute the query command during read operation.,Source=Microsoft.DataTransfer.Connectors.GenericAdoNet,''Type=Apache.Arrow.Adbc.C.CAdbcDriverImporter+ImportedAdbcException,Message=[Snowflake] 100089 (42501): Failed to access remote file: access denied. Please check your credentials,Source=Apache.Arrow.Adbc,'
解決策
設定値
重要設定
- ソースの[追加の Snowflake コピー オプション]にMAX_FILE_SIZEを1073741824に指定
- Snowflakeのウェアハウスのサイズを大きめにする(今回はXsmallからLargeに変更)
- Write batch timeoutをデフォルトから伸ばす(今回は8h)
実行結果詳細
明らかに「ソースからステージングまでの期間」が前回より短縮された
「ステージングから目的までの期間」が約1時間半かかっていることからWrite batch timeoutは伸ばすことが必須だといえる(デフォルトの30分では不十分)
Snowflake側からのCOPY INTOの結果詳細
FabricのUIから設定したMAX_FILE_SIZEがクエリに反映されていることが分かる
原因はワークスペースステージングではなく、「unloadに時間かかってる間にSASのトークンの期限が切れてる」からと予想
Azure Data Factory または Azure Synapse Analytics を使用して、Snowflake V2 のデータをコピーして変換するから、ワークスペースステージングが怪しいと思ったが、
失敗時のコピーアクティビティの裏側(Snowflakeのクエリ履歴から)を確認してい見るとワークスペースステージングのSASは正常に入力されていることを確認
COPY INTO 'azure://~~~/_system/services/DI/pipelines/~~~~/SnowflakeExportCopyCommand/' FROM "TPCDS_SF100TCL"."CATALOG_SALES" CREDENTIALS = (AZURE_SAS_TOKEN = '☺☺☺☺☺') FILE_FORMAT = (type = CSV COMPRESSION = NONE RECORD_DELIMITER = '
' FIELD_DELIMITER = ',' FIELD_OPTIONALLY_ENCLOSED_BY = '"' ESCAPE = '"' NULL_IF = '') HEADER = TRUE SINGLE = FALSE OVERWRITE = TRUE
試しに小さいテーブルでも(ワークスペースステージングON)試してみたところ
以上などから
原因はCOPY INTOが長時間に及んでいる際にSASトークンの期限が切れてることだと予想
【参考】Fabricパイプラインの追加の Snowflake 形式オプションからParquetを指定するとエラー
SnowflakeのCOPY INTOのオプション設定にも記載がある通り、formatTypeOptionsをParquetにしてやりたかったが、現状Fabricのパイプラインからは指定するとエラーになる。
設定値
ソースの追加の Snowflake 形式オプションに以下を入力
しかしエラーになる
以下エラーメッセージ
ErrorCode=SnowflakeExportCopyCommandOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Snowflake Export Copy Command operation failed,Source=Microsoft.DataTransfer.Connectors.Snowflake,''Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Failed to execute the query command during read operation.,Source=Microsoft.DataTransfer.Connectors.GenericAdoNet,''Type=Apache.Arrow.Adbc.C.CAdbcDriverImporter+ImportedAdbcException,Message=[Snowflake] 002135 (42601): SQLコンパイルエラー:
オプション RECORD_DELIMITER は、ファイル形式型 PARQUETには無効です。,Source=Apache.Arrow.Adbc,'
Snowflake側のクエリ履歴を確認
type=Parquetが反映されているのは確認できるが、
RECORD_DELIMITERなどtype=CSVの時のオプション項目がデフォルトで設定されており、これはParquet時には不要なためエラーとなっている。
現状これをFabric側から消去する方法は見つかっていない。
参考リンク
用語
storageIntegration
- Snowflake から外部ストレージ(Azure, AWS, GCP など)と連携するための仕組み
- ステージングとは別の概念 で、認証やアクセス権限を管理するための Snowflake の機能
- 例えば Azure Blob Storage や AWS S3 に直接データをコピーしたいときに使う
アンロード
アンロード(UNLOAD)はデータを外部ストレージやステージにエクスポートすること
一方で、ダウンロード(DOWNLOAD)はデータをローカルPC に保存
混同しないように注意
アンロードとダウンロードの由来
🔹 なぜ「アン(UNLOAD)」?「UNLOAD」は、システム(データベースや DWH)から外部ストレージにデータを移すことを指す。
「システムからデータを外へ放出する(Unload = 降ろす)」というイメージ。
データベースやDWH では、データをそのまま保存することが多いから、外に出すときに「Unload(降ろす)」と言う。
🔹 なぜ「ダウン(DOWNLOAD)」?
「ダウンロード(DOWNLOAD)」は、主にユーザー視点で「データをローカル環境に取得する」ことを指す。
「上のシステム(クラウドやサーバー)から、手元(PC)にデータを持ってくる」
「Download」は「データが高いところ(クラウド)から落ちてくる(Down)」というイメージ。
✅ 「Unload」は昔からある英単語(元々の意味は「荷物を降ろす」)
✅ 「Download」はコンピューター時代に生まれた言葉(デジタルデバイスが普及してから)