Azure Data Factory或 Azure Synapse Analytics 中的管線執行和觸發程序

適用於:Azure Data Factory Azure Synapse Analytics

提示

試用 Microsoft Fabric 中的 Data Factory,這是適用於企業的全方位分析解決方案。 Microsoft Fabric 涵蓋從資料移動到資料科學、即時分析、商業智慧和報告的所有項目。 了解如何免費開始新的試用

在 Azure Data Factory 與 Azure Synapse 中,管線執行可定義管線執行的執行個體。 例如,假設您的管線會在上午 8 點、9 點和 10 點執行。 在此情況下,管線會有三個個別的執行 (或管線執行)。 每個管線執行都有唯一的管線執行識別碼。 執行識別碼是一組 GUID,可唯一定義特定的管線執行。

將引數傳遞給管線中定義的參數,通常可將管線執行具現化。 您可以用手動方式或使用「觸發程序」來執行管線。 本文提供兩種管線執行方式的詳細資料。

使用 UI 建立觸發程序

若要手動觸發管線或設定新的排程、輪轉視窗、儲存體事件或自訂事件觸發程序,請選取管線編輯器頂端的 [新增觸發程序]。

Shows how to add a new trigger with UI from the pipeline editor.

如果您選擇手動觸發管線,則其會立即執行。 否則,如果您選擇 [新增/編輯],系統會提示您使用 [新增觸發程序] 視窗來選擇要編輯的現有觸發程序,或建立新的觸發程序。

Shows the add triggers window highlighting where to create a new trigger.

您將會看到觸發程序設定視窗,您可以在其中選擇觸發程序類型。

Shows the new trigger configuration window with the type dropdown showing the various types of triggers you can create.

深入瞭解下方的已排程輪轉視窗儲存體事件自訂事件觸發程序。

使用 JSON 手動執行 (隨選)

管線的手動執行也稱為依需求執行。

例如,假設您想要執行名為 copyPipeline 的基本管線。 此管線只有單一活動,從 Azure Blob 儲存體的來源資料夾複製到相同儲存體中的目的地資料夾。 下列 JSON 定義將說明此範例管線:

{
    "name": "copyPipeline",
    "properties": {
        "activities": [
            {
                "type": "Copy",
                "typeProperties": {
                    "source": {
                        "type": "BlobSource"
                    },
                    "sink": {
                        "type": "BlobSink"
                    }
                },
                "name": "CopyBlobtoBlob",
                "inputs": [
                    {
                        "referenceName": "sourceBlobDataset",
                        "type": "DatasetReference"
                    }
                ],
                "outputs": [
                    {
                        "referenceName": "sinkBlobDataset",
                        "type": "DatasetReference"
                    }
                ]
            }
        ],
        "parameters": {
            "sourceBlobContainer": {
                "type": "String"
            },
            "sinkBlobContainer": {
                "type": "String"
            }
        }
    }
}

在 JSON 定義中,管線採用兩個參數:sourceBlobContainersinkBlobContainer。 您可以在執行階段將值傳遞給這些參數。

您可以使用下列其中一種方法,手動執行管線:

  • .NET SDK
  • Azure PowerShell 模組
  • REST API
  • Python SDK

REST API

下列範例命令說明如何使用 REST API 以手動方式來執行管線:

POST
https://management.azure.com/subscriptions/mySubId/resourceGroups/myResourceGroup/providers/Microsoft.DataFactory/factories/myDataFactory/pipelines/copyPipeline/createRun?api-version=2017-03-01-preview

如需完整範例,請參閱快速入門:使用 REST API 建立資料處理站

Azure PowerShell

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 請參閱安裝 Azure PowerShell 以開始使用。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

下列範例命令說明如何使用 Azure PowerShell 以手動方式執行管線:

Invoke-AzDataFactoryV2Pipeline -DataFactory $df -PipelineName "Adfv2QuickStartPipeline" -ParameterFile .\PipelineParameters.json -ResourceGroupName "myResourceGroup"

您可以在要求承載的本文中傳遞參數。 在 .NET SDK、Azure PowerShell 和 Python SDK 中,您可以在當作引數傳給呼叫的字典中傳入值:

{
  "sourceBlobContainer": "MySourceFolder",
  "sinkBlobContainer": "MySinkFolder"
}

回應承載是管道執行的唯一識別碼:

{
  "runId": "0448d45a-a0bd-23f3-90a5-bfeea9264aed"
}

如需完整範例,請參閱快速入門:使用 Azure PowerShell 建立資料處理站

.NET SDK

下列範例呼叫說明如何使用 .NET SDK 以手動方式執行管線:

client.Pipelines.CreateRunWithHttpMessagesAsync(resourceGroup, dataFactoryName, pipelineName, parameters)

如需完整範例,請參閱快速入門:使用 .NET SDK 建立資料處理站

注意

您可以使用 .NET SDK 從 Azure Functions、您的 Web 服務等途徑叫用管線。

使用 JSON 觸發執行

觸發程序是執行管線執行的另一種方式。 觸發程序代表一個處理單位,用來決定何時需要啟動管道執行。 目前,該服務支援三種類型的觸發程序:

  • 排程觸發程序:可依時鐘排程來叫用管線的觸發程序。

  • 輪轉視窗觸發程序:依定期間隔運作且同時保有狀態的觸發程序。

  • 事件型觸發程序:會回應事件的觸發程序。

管線和觸發程序具有多對多關聯性 (但輪轉視窗觸發程序除外)。 多個觸發程序可以啟動單一管線,或單一觸發程序可以啟動多個管線。 在下列觸發程序定義中,pipelines 屬性會參考由特定觸發程序所觸發的管線清單。 屬性定義包含管線參數的值。

基本觸發程序定義

{
    "properties": {
        "name": "MyTrigger",
        "type": "<type of trigger>",
        "typeProperties": {...},
        "pipelines": [
            {
                "pipelineReference": {
                    "type": "PipelineReference",
                    "referenceName": "<Name of your pipeline>"
                },
                "parameters": {
                    "<parameter 1 Name>": {
                        "type": "Expression",
                        "value": "<parameter 1 Value>"
                    },
                    "<parameter 2 Name>": "<parameter 2 Value>"
                }
            }
        ]
    }
}

使用 JSON 排程觸發程序

排程觸發程序會依時鐘排程來執行管線。 此觸發程序支援定期和進階行事曆選項。 例如,此觸發程序支援「每週」、「星期一下午 5 點和星期四晚上 9 點」之類的間隔。排程觸發程序很有彈性,因為它不受限於特定資料集模式,也不會區別時間序列和非時間序列的資料。

如需關於排程觸發程序的詳細資訊和範例,請參閱建立依排程執行管線的觸發程序

排程觸發程序定義

在建立排程觸發程序時,您必須使用 JSON 定義指定排程和週期。

若要讓排程觸發程序啟動管線執行,請在觸發程序定義中包含特定管線的管線參考。 管道和觸發程序具有多對多關聯性。 多個觸發程序可以啟動單一管道。 單一觸發程序可以啟動多個管道。

{
  "properties": {
    "type": "ScheduleTrigger",
    "typeProperties": {
      "recurrence": {
        "frequency": <<Minute, Hour, Day, Week, Year>>,
        "interval": <<int>>, // How often to fire
        "startTime": <<datetime>>,
        "endTime": <<datetime>>,
        "timeZone": "UTC",
        "schedule": { // Optional (advanced scheduling specifics)
          "hours": [<<0-24>>],
          "weekDays": [<<Monday-Sunday>>],
          "minutes": [<<0-60>>],
          "monthDays": [<<1-31>>],
          "monthlyOccurrences": [
            {
              "day": <<Monday-Sunday>>,
              "occurrence": <<1-5>>
            }
          ]
        }
      }
    },
  "pipelines": [
    {
      "pipelineReference": {
        "type": "PipelineReference",
        "referenceName": "<Name of your pipeline>"
      },
      "parameters": {
        "<parameter 1 Name>": {
          "type": "Expression",
          "value": "<parameter 1 Value>"
        },
        "<parameter 2 Name>": "<parameter 2 Value>"
      }
    }
  ]}
}

重要

parameters 屬性是 pipelines 元素的必要屬性。 如果您的管線未採用任何參數,您就必須為 parameters 屬性加入一個空的 JSON 定義。

結構描述概觀

下表提供與觸發程序之週期和排程相關的主要結構描述元素概觀:

JSON 屬性 描述
startTime 日期時間值。 在基本排程中,startTime 屬性的值會套用至第一個發生項目。 在複雜的排程中,觸發程序會在到了指定的 startTime 值才啟動。
endTime 觸發程序的結束日期和時間。 觸發程序在指定的結束日期和時間之後便不再執行。 此屬性的值不可以是過去的時間。
timeZone 時區。 如需支援時區的清單,請參閱建立依排程執行管線的觸發程序
recurrence 指定觸發程序之週期規則的 recurrence 物件。 recurrence 物件支援 frequencyintervalendTimecountschedule 元素。 定義 recurrence 物件時,必須一併定義 frequency 元素。 其他 recurrence 物件元素則為選用元素。
frequency 觸發程序重複執行時的頻率單位。 支援的值包括 "minute"、"hour"、"day"、"week" 及 "month"。
interval 代表 frequency 值之間隔的整數值。 frequency 值可決定觸發程序執行的頻率。 例如,如果 interval 為 3,而 frequency 為 "week",觸發程序就會每隔三週重複執行一次。
schedule 觸發程序的週期排程。 具有指定之 frequency 值的觸發程序會根據週期排程來改變其週期。 schedule 屬性會根據分鐘、小時、星期幾、月日及週數來修改週期。

排程觸發程序範例

{
  "properties": {
    "name": "MyTrigger",
    "type": "ScheduleTrigger",
    "typeProperties": {
      "recurrence": {
        "frequency": "Hour",
        "interval": 1,
        "startTime": "2017-11-01T09:00:00-08:00",
        "endTime": "2017-11-02T22:00:00-08:00"
      }
    },
    "pipelines": [{
        "pipelineReference": {
          "type": "PipelineReference",
          "referenceName": "SQLServerToBlobPipeline"
        },
        "parameters": {}
      },
      {
        "pipelineReference": {
          "type": "PipelineReference",
          "referenceName": "SQLServerToAzureSQLPipeline"
        },
        "parameters": {}
      }
    ]
  }
}

結構描述預設值、限制及範例

JSON 屬性 類型 必要 預設值 有效值 範例
startTime string Yes ISO 8601 日期時間 "startTime" : "2013-01-09T09:30:00-08:00"
recurrence object Yes Recurrence 物件 "recurrence" : { "frequency" : "monthly", "interval" : 1 }
interval 數值 No 1 1 到 1000 "interval":10
endTime string Yes 代表未來時間的日期時間值 "endTime" : "2013-02-09T09:30:00-08:00"
schedule object No Schedule 物件 "schedule" : { "minute" : [30], "hour" : [8,17] }

startTime 屬性

下表說明 startTime 屬性如何控制觸發程序執行:

startTime 值 週期性無排程 週期性有排程
開始時間在過去 計算開始時間之後的第一個未來執行時間,並在該時間執行。

根據上次執行時間算出的時間執行後續的執行作業。

請參閱本表後面的範例。
觸發程序會在「到了」指定的開始時間才啟動。 第一次發生是根據排程,從開始時間計算。

根據週期排程執行後續的執行作業。
開始時間在未來或為目前時間 在指定的開始時間執行一次。

根據上次執行時間算出的時間執行後續的執行作業。
觸發程序會在「到了」指定的開始時間才啟動。 第一次發生是根據排程,從開始時間計算。

根據週期排程執行後續的執行作業。

我們來看看一個範例:當開始時間在過去、具有週期性但無排程時,會發生什麼情況。 假設目前時間是 2017-04-08 13:00,開始時間是 2017-04-07 14:00,而週期是每隔兩天。 (定義 recurrence 值的方式是將 frequency 屬性設定為 "day",並將 interval屬性設定為 2)。請注意,startTime 值是過去的時間,發生在目前時間之前。

根據這些條件,第一次執行是在 2017-04-09 14:00。 排程器引擎會從開始時間計算執行週期。 過去的任何執行個體都會遭到捨棄。 引擎會使用下一個在未來發生的執行個體。 在此案例中,開始時間是 2017-04-07 下午 2:00。 下一個執行個體是在該時間的 2 天後,也就是 2017-04-09 下午 2:00。

第一次執行時間相同,即使 startTime 為 2017-04-05 14:00 或 2017-04-01 14:00。 在第一次執行之後,就會使用排程來算出後續的執行時間。 因此,後續執行在2017-04-11 下午 2:00,然後在 2017-04-13 下午 2:00,然後在 2017-04-15 下午 2:00,依此類推。

最後,當未在觸發程序的排程中設定小時或分鐘時,將會使用第一次執行的小時或分鐘作為預設值。

schedule 屬性

您可以使用 schedule 來「限制」作業執行的數目。 例如,如果將每月執行的觸發程序排定為只在 31 日執行,則該觸發程序將只會在有第 31 天的月份執行。

您也可以使用 schedule 來「擴充」作業執行的數目。 例如,如果將每月執行的觸發程序排定在月份的 1 日和 2 日執行,該觸發程序就會在月份的第 1 天和第 2 天執行,而不是一個月執行一次。

如果指定了多個 schedule 元素,則評估的順序是從最大到最小排程設定:第幾週、月日、星期幾、小時、分鐘。

下表詳細說明 schedule 元素:

JSON 元素 描述 有效值
分鐘 一小時內觸發程序執行的分鐘數。 - 整數
- 一連串整數
hours 一天內觸發程序執行的小時數。 - 整數
- 一連串整數
weekDays 觸發程序執行的星期幾。 此值只能搭配 weekly 頻率指定。
- 星期一
- 星期二
- 星期三
- 星期四
- 星期五
- 星期六
- 星期六
- 日期值陣列 (最大陣列大小為 7)

日值不區分大小寫
monthlyOccurrences 觸發程序在一個月中的執行日。 此值只能與 monthly 頻率搭配指定。 - monthlyOccurrence 物件的陣列︰{ "day": day, "occurrence": occurrence }
- day 屬性是觸發程序在一週中的執行日。 例如,day 值為 {Sunday}monthlyOccurrences 屬性意謂著月份中的每個星期日。 day 屬性為必要屬性。
- occurrence 屬性係指所指定的 day 在月份中出現的位置。 例如,dayoccurrence 值為 {Sunday, -1}monthlyOccurrences 屬性意謂著月份中的最後一個星期日。 occurrence 屬性為選用屬性。
monthDays 觸發程序在一個月中的執行日。 此值只能與 monthly 頻率搭配指定。 - <= -1 且 >= -31 的任何值
- >= 1 且 <= 31 的任何值
- 值的陣列

輪轉視窗觸發程序

輪轉視窗觸發程序是可從指定的開始時間定期引發,同時還能保留狀態的一種觸發程序。 輪轉視窗是一系列大小固定、非重疊的連續時間間隔。

如需關於輪轉視窗觸發程序的詳細資訊和範例,請參閱建立輪轉視窗觸發程序

觸發程序週期排程的範例

本節提供週期排程的範例。 其焦點放在 schedule 物件及其元素。

這些範例會假設 interval 值為 1,且 frequency 值根據排程定義是正確的。 例如,您不能既將 frequency 值設定為 "day",又在 schedule 物件中包含 monthDays 修改。 上一節中的表格說明這些限制。

範例 描述
{"hours":[5]} 在每天的上午 5:00 執行。
{"minutes":[15], "hours":[5]} 在每天的上午 5:15 執行。
{"minutes":[15], "hours":[5,17]} 在每天的上午 5:15 和下午 5:15 執行。
{"minutes":[15,45], "hours":[5,17]} 在每天的上午 5:15、上午 5:45、下午 5:15 及下午 5:45 執行。
{"minutes":[0,15,30,45]} 每隔 15 分鐘執行一次。
{hours":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]} 每小時執行一次。

此觸發程序每小時執行一次。 已指定值時,分鐘會受 startTime 值控制。 如果未指定值,分鐘就會受建立時間控制。 例如,如果開始時間或建立時間 (無論套用哪一個) 為下午 12:25,觸發程序就會在 00:25、01:25、02:25、… 及 23:25 執行。

此排程相當於將觸發程序設定成 frequency 值為 "hour"、interval 值為 1,且沒有 schedule。 此排程可以與不同的 frequencyinterval 值搭配使用,以建立其他觸發程序。 例如,當 frequency 值為 "month" 時,排程一個月只會執行一次,而不是像 frequency 值為 "day" 時會每天執行。
{"minutes":[0]} 在每小時整點執行。

此觸發程序會在每小時整點執行,從上午 12:00 開始,接著在上午 1:00、上午 2:00,依此類推。

此排程相當於將觸發程序設定成 frequency 值為 "hour"、startTime 值為零分鐘,而且沒有 schedule,但 frequency 值為 "day"。 如果 frequency 值為 "week" 或 "month",排程將只會分別在每週的一天或每個月的一天執行。
{"minutes":[15]} 在每小時的 15 分執行。

此觸發程序會在每小時的 15 分執行,從上午 00:15 開始,接著在上午 1:15、上午 2:15,依此類推,並在下午 11:15 結束。
{"hours":[17], "weekDays":["saturday"]} 在每週星期六的下午 5:00 執行。
{"hours":[17], "weekDays":["monday", "wednesday", "friday"]} 在每週星期一、星期三及星期五的下午 5:00 執行。
{"minutes":[15,45], "hours":[17], "weekDays":["monday", "wednesday", "friday"]} 在每週星期一、星期三及星期五的下午 5:15 和 5:45 執行。
{"minutes":[0,15,30,45], "weekDays":["monday", "tuesday", "wednesday", "thursday", "friday"]} 在工作日每隔 15 分鐘執行一次。
{"minutes":[0,15,30,45], "hours": [9, 10, 11, 12, 13, 14, 15, 16] "weekDays":["monday", "tuesday", "wednesday", "thursday", "friday"]} 在工作日的上午 9:00 與下午 4:45 之間每隔 15 分鐘執行一次。
{"weekDays":["tuesday", "thursday"]} 在星期二和星期四的指定開始時間執行。
{"minutes":[0], "hours":[6], "monthDays":[28]} 在每個月的第二十八天於上午 6:00 執行 (假設 frequency 值為 "month")。
{"minutes":[0], "hours":[6], "monthDays":[-1]} 在月份最後一天的上午 6:00 執行。

若要在月份的最後一天執行觸發程序,請使用 -1,而不要使用 28、29、30 或 31。
{"minutes":[0], "hours":[6], "monthDays":[1,-1]} 在每個月第一天和最後一天的上午 6:00 執行。
{monthDays":[1,14]} 在每個月第一天和第十四天指定的開始時間執行。
{"minutes":[0], "hours":[5], "monthlyOccurrences":[{"day":"friday", "occurrence":1}]} 在每個月第一個星期五的上午 5:00 執行。
{"monthlyOccurrences":[{"day":"friday", "occurrence":1}]} 在每個月第一個星期五的指定開始時間執行。
{"monthlyOccurrences":[{"day":"friday", "occurrence":-3}]} 在每個月倒數第三個星期五的指定開始時間執行。
{"minutes":[15], "hours":[5], "monthlyOccurrences":[{"day":"friday", "occurrence":1},{"day":"friday", "occurrence":-1}]} 在每個月第一個和最後一個星期五的上午 5:15 執行。
{"monthlyOccurrences":[{"day":"friday", "occurrence":1},{"day":"friday", "occurrence":-1}]} 在每個月第一個和最後一個星期五的指定開始時間執行。
{"monthlyOccurrences":[{"day":"friday", "occurrence":5}]} 在每個月第五個星期五的指定開始時間執行。

如果當月沒有第五個星期五,管線就不會執行。 若要在月份中最後一個出現的星期五執行觸發程序,請考慮使用 -1 而不是 5 來作為 occurrence 的值。
{"minutes":[0,15,30,45], "monthlyOccurrences":[{"day":"friday", "occurrence":-1}]} 在月份中最後一個星期五每隔 15 分鐘執行一次。
{"minutes":[15,45], "hours":[5,17], "monthlyOccurrences":[{"day":"wednesday", "occurrence":3}]} 在每個月第三個星期三的上午 5:15、上午 5:45、下午 5:15 及下午 5:45 執行。

觸發程序類型比較

輪轉視窗觸發程序和排程觸發程序皆依時間活動訊號運作。 兩者有何不同?

注意

輪轉視窗觸發程式執行會等候觸發的管線執行完成。 其執行狀態會反映觸發管線執行的狀態。 例如,如果已觸發的管線執行已取消,對應的輪轉視窗觸發程序執行會標示為已取消。 這與排程觸發程序的「射後不理」行為不同,只要管線執行開始便會標示為成功。

下表提供輪轉視窗觸發程序與排程觸發程序的比較:

項目 輪轉視窗觸發程序 排程觸發程序
回填案例 支援。 管線執行可排程於過去的時間範圍執行。 不支援。 管線執行只能排在目前到未來的期間內執行。
可靠性 100% 可靠性。 管線執行可排程於指定的開始日期之後的所有時間範圍執行,且不間斷。 較不可靠。
功能 支援。 失敗管線執行的預設重試原則為 0,或是使用者在觸發程序定義中指定的原則。 當管線執行因為並行/伺服器/節流限制而失敗 (也就是狀態碼 400:使用者錯誤、429:太多要求和 500:內部伺服器錯誤) 時,將會自動重試。 不支援。
並行 支援。 使用者可以明確設定觸發程序的並行限制。 允許 1 個到 50 個已觸發的並行管線執行。 不支援。
系統變數 除了 @trigger().scheduledTime 與 @trigger().startTime,其也支援使用 WindowStartWindowEnd 系統變數。 使用者可以存取 trigger().outputs.windowStartTimetrigger().outputs.windowEndTime 作為觸發程序定義中的觸發程序系統變數。 其值會分別作為時間範圍開始時間和時間範圍結束時間。 例如,對於每小時執行一次的輪轉視窗觸發程序,如果時間範圍為凌晨 1 點到凌晨 2 點,則定義為 trigger().outputs.windowStartTime = 2017-09-01T01:00:00Ztrigger().outputs.windowEndTime = 2017-09-01T02:00:00Z 僅支援預設 @trigger().scheduledTime 和 @trigger().startTime 變數。
管線與觸發程序的關聯性 支援一對一關聯性。 只能觸發一個管線。 支援多對多關聯性。 多個觸發程序可以啟動單一管道。 單一觸發程序可以啟動多個管道。

事件架構觸發程序

事件型觸發程序會執行管線以回應事件。 事件型觸發程序有兩種類型。

  • 儲存體事件觸發程序會針對儲存體帳戶中發生的事件執行管線,例如檔案的抵達,或刪除 Azure Blob 儲存體帳戶中的檔案。
  • 自訂事件觸發程序會在事件方格中處理自訂發行項

如需事件型觸發程序的詳細資訊,請參閱儲存體事件觸發程序自訂事件觸發程序

請參閱下列教學課程: