Data Factory のコピーアクティビティーを使用したデータコピーでは、ステージングコピー を使用することができます。ステージングは、DWH に対してデータコピーを行う際に使用されるケースがあるのではないでしょうか。
ステージング コピーのしくみ には次の記載があります。
コピー アクティビティの実行後に一時データをクリーンアップできるように、ステージング ストレージ内の Azure Data Factory に削除アクセス許可を付与する必要があります。
コピーアクティビティにより格納されたステージングデータですがアクティビティ内のクリーンアップで自動的に削除が行われます。
しかし、Azure BLOB ストレージを使用している場合は問題ないのですが、ADL Gen2 をステージングアカウントとして使用した場合、コピーアクティビティが実行されるたびに、指定したステージングデータを格納するコンテナー内にファイルは存在しないのですが、GUID のディレクトリが残った状態となるという事象が発生します。
本事象ですが、ADL Gen2 をステージングアカウントととして指定した場合に必ず発生するわけではなく、コピー先によって発生有無が変わってくるようです。今回は、Fabric の Data Warehouse に対してデータのコピーを実施する際に発生しましたが、Synapse DWH でも発生するはずです。
この動作は現時点では想定された動作となり (SR で確認済み) 、ディレクトリの削除をパイプライン内で実行するためには本投稿のような対応を検討する必要がありますので、対応方法を残しておきたいと思います。
GUID のディレクトリを削除する方法
GUID のディレクトリが残ってしまう理由
ステージングアカウントを使用してデータコピーを実施した場合、上述のように Fabric / Synapse の DWH に対してデータのコピーを実施した場合、「/<コンテナー>/<GUID>/SynapseImportCommand/」というディレクトリ内にステージングコピー用のデータが格納されています。
GUID 以下のディレクトリ構造は、データコピー時に自動的に作成が行われています。
このディレクトリ内のデータはコピーの処理終了時に削除が行われているのですが、削除対象は「/<コンテナー>/<GUID>/SynapseImportCommand」ディレクトリならびに配下のファイルとなっており、コンテナー直下に作成された GUID のディレクトリについては削除が行われていません。
Azure BLOB ストレージの場合、ディレクトリは仮想的な構造となるため、末端のディレクトリのファイルがすべて削除されれば GUID のディレクトリも自動的に存在しない状態となるかと思います。
しかし、ADL Gen2 はディレクトリは実体としてありますので、GUID のディレクトリの削除が明示的に行われない限りは、上述の画像のようにディレクトリが残った状態となってしまいます。
GUID のディレクトリを削除する方法
現時点では ADL Gen2 をステージングアカウントとして指定した場合のこの挙動は想定される動作となり、コピーアクティビティの何らかの設定を変更すれば回避できるというものではなく、削除処理を明示的に設定する必要があります。
削除方法についてはいくつかの手法があるかと思いますが、今回はパイプラインの構成を次のようにしています。
データコピーアクティビティの後に、削除 (Delete) アクティビティを追加し、明示的にディレクトリの削除を行っています。
パイプラインが複数同時に実行される可能性があるかと思いますので、データコピーのステージングアカウントのパスの設定としては次のように設定しています。
通常、「Storage path」には、ステージングデータを格納するコンテナー名のみ (上記例であれば staging) を指定するケースが多いのではないでしょうか。
今回は「staging/@{pipeline().RunId}」として、コンテナー配下に実行 ID 毎のディレクトリを作成するように指定しています。
これにより、ステージングデータが出力される際のディレクトリ構造が「/<コンテナー>/<実行 ID>/<GUID>/SynapseImportCommand」という構造になり、複数同時にパイプラインが実行された場合でも、実行しているトリガーのステージングデータの判断ができるようになります。
削除アクティビティでは、リンクサービスとして削除を実施するストレージを指定する必要がありますが、ファイルパスの設定では、「@dataset().workDirectory」というようにパラメーターを指定してディレクトリ名を実行時に指定できるようにしています。
これにより、コピー実行後の削除時に実行 ID を指定することができるようになりますので、削除アクティビティで次のような指定をすることで、コンテナー配下の実行 ID のディレクトリ配下を削除することが可能となります。
ADL Gen2 をステージングアカウントとして使用した際に、GUID のディレクトリが残ってしまうという事象に遭遇した場合は、このような対応をすることで対応することができるのではないでしょうか。