Azure Data Factory Pipelineの実行Statusについて

Azure
スポンサーリンク

こんにちは!やましー@データ活用クラウドエンジニア(@yamashi18041)です!

私はMicrosoftのクラウドサービスである、Azure上にデータ基盤を作る仕事をしています。

データ基盤を作るときに必要になってくるETL(抽出、変換、格納)。

AzureにはData FactoryというPaaS(Platform as a Service)があり、そのパイプラインでETLを実現することができます。

今回プロジェクトで、コード上からData Factoryのパイプラインを実行するため、以下の公式ドキュメントサイトを参考にコーディングしたところ、不備が見つかったのでその解説をしたいと思います。(この記事は2020年3月10日に執筆しています。)

スポンサーリンク

PoawerShellで実行パイプラインを実行する

Azure Data Factory を使用してデータを Blob Storage 内でコピーする - Azure Data Factory
PowerShell を使用して Azure データ ファクトリを作成し、Azure Blob Storage 内のある場所から別の場所にデータをコピーします。

この記事によればデータファクトリのパイプラインを実行し、そのステータスを監視することになっています。

Invoke-AzDataFactoryV2Pipelineによりパイプラインを実行。

$RunId = Invoke-AzDataFactoryV2Pipeline `
  -DataFactoryName $DataFactory.DataFactoryName `
  -ResourceGroupName $ResGrp.ResourceGroupName `
  -PipelineName $DFPipeLine.Name
スポンサーリンク

実行ステータスを監視する

次にGet-AzDataFactoryV2PipelineRunを使い実行ステータスを監視し、処理の終了を待ちます。

while ($True) {
    $Run = Get-AzDataFactoryV2PipelineRun `
        -ResourceGroupName $ResGrp.ResourceGroupName `
        -DataFactoryName $DataFactory.DataFactoryName `
        -PipelineRunId $RunId

    if ($Run) {
        if ($run.Status -ne 'InProgress') {
            Write-Output ("Pipeline run finished. The status is: " +  $Run.Status)
            $Run
            break
        }
        Write-Output "Pipeline is running...status: InProgress"
    }

    Start-Sleep -Seconds 10
}

8行目で”InProgress”である場合はパイプライン処理実行中であるため、10秒sleepして監視を繰り返します。

スポンサーリンク

StatusはQueuedも返ってくる

これを実装してみましたが、挙動が怪しく、本当に”InProgress”だけを監視し続ければよいのか疑問を持ったので確認してみたところ”Queued”も返ってくることが分かりました。

Queuedとはパイプライン実行させたときに処理待ちのQueueにある状態で、この状態は待つ必要があります。

スポンサーリンク

どのようなステータスが返ってくるか調べてみた

そうなってくると他にどのようなStatusがあるのか気になってきたので、いろいろ調べてみました。

公式のドキュメントはありませんが、Microsoft公式のドキュメントを管理するGitHubでコメントがありました。

Sample code that checks pipeline run status doesn't account for 'Queued' status · Issue #23801 · MicrosoftDocs/azure-docs
The samples are checking for the pipeline run to finish by waiting when the status is "InProgress". However, if the status is "Queued", then the code will conti...
スポンサーリンク

Azure Data Factoryで返ってくるStatus一覧

  • Queued
  • InProgress
  • Succeeded
  • Failed
  • Cancelled
  • Canceling

この中で処理を待つ必要があるのはQueuedとInProgressだけのようです。

スポンサーリンク

Queuedも加味したコード

ということで監視のコードを改造。

while ($True) {
    $Run = Get-AzDataFactoryV2PipelineRun `
        -ResourceGroupName $ResGrp.ResourceGroupName `
        -DataFactoryName $DataFactory.DataFactoryName `
        -PipelineRunId $RunId

    if ($Run) {
        switch ($run.Status) {
            'Queued' {}
            'InProgress' {}
            default {
                Write-Output ("Pipeline run finished. The status is: " +  $Run.Status)
                $Run
                break PiplineEnd 
            }
        }
        Write-Output "Pipeline is running...status: $Run.Status"
    }

    Start-Sleep -Seconds 10
}:PiplineEnd

これでQueuedの場合も確実に待つようになりました。

スポンサーリンク

まとめ

今回はAzure Data Factoryのパイプラインの実行ステータスについて調べてみました。

公式ドキュメントにあるサンプルコードでもしっかりと検証が必要という事を忘れずに、クラウドを手なずけていきましょう!

Azure Data Factoryについてより詳しく知りたい方はこちらの記事もどうぞ。

最後まで読んでいただきありがとうございました。

以上、やましー@データ活用クラウドエンジニア(@yamashi18041)でした。

タイトルとURLをコピーしました