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

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

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

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

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

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

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

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

https://docs.microsoft.com/ja-jp/azure/data-factory/quickstart-create-data-factory-powershell#monitor-the-pipeline-run

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

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でコメントがありました。

https://github.com/MicrosoftDocs/azure-docs/issues/23801#issuecomment-480393077

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)でした。