我对数据工厂中预定管道的执行顺序遇到了一些麻烦。
我的管道如下:
{
"name": "Copy_Stage_Upsert",
"properties": {
"description": "",
"activities": [
{
"type": "Copy",
"typeProperties": {
"source": {
"type": "BlobSource"
},
"sink": {
"type": "SqlDWSink",
"writeBatchSize": 10000,
"writeBatchTimeout": "00:10:00"
}
},
"inputs": [
{
"name": "csv_extracted_file"
}
],
"outputs": [
{
"name": "stage_table"
}
],
"policy": {
"timeout": "01:00:00",
"retry": 2
},
"scheduler": {
"frequency": "Hour",
"interval": 1
},
"name": "Copy to stage table"
},
{
"type": "Copy",
"typeProperties": {
"source": {
"type": "SqlDWSource",
"sqlReaderQuery": "SELECT * from table WHERE id NOT IN (SELECT id from stage_table) UNION ALL SELECT * from stage_table"
},
"sink": {
"type": "SqlDWSink",
"writeBatchSize": 10000,
"writeBatchTimeout": "00:10:00"
}
},
"inputs": [
{
"name": "stage_table"
}
],
"outputs": [
{
"name": "upsert_table"
}
],
"policy": {
"timeout": "01:00:00",
"retry": 2
},
"scheduler": {
"frequency": "Hour",
"interval": 1
},
"name": "Copy"
},
{
"type": "SqlServerStoredProcedure",
"typeProperties": {
"storedProcedureName": "sp_rename_tables"
},
"inputs": [
{
"name": "upsert_table"
}
],
"outputs": [
{
"name": "table"
}
],
"scheduler": {
"frequency": "Hour",
"interval": 1
},
"name": "Rename tables"
}
],
"start": "2017-02-09T18:00:00Z",
"end": "9999-02-06T15:00:00Z",
"isPaused": false,
"hubName": "",
"pipelineMode": "Scheduled"
}
}
为简单起见,想象一下,我有一个名为A的管道,有三个简单的任务: 任务1 ,任务2 ,最后任务3 。
情景A
管道A预定的一次执行。
它的运行方式为:
任务1 - >任务2 - >任务3
情景B
计划执行的管道A的两次或多次执行。
它的运行方式为:
第一个预定的流水线任务1 - >第二计划管道任务1 - >第一预定管道任务2 - >第二计划管道任务2 - >第一预定管道任务2 - >第一预定管道任务3 - >第二个计划管道任务3。
是否可以将第二种情况作为:
运行第一个预定的流水线任务1 - >第一预定管道任务2 - >第一预定流水线任务3,第二预定流水线任务1 - >第二计划管道任务2 - >第二个计划管道任务3
换句话说,我需要在第二个管道启动之前完成第一个预定管道。
提前谢谢!
答案 0 :(得分:0)
这是可能的。但是,它需要一些假的输入和输出数据集来强制执行依赖行为并在您描述时创建链。可能,但是一个肮脏的黑客!
这不是一个很好的解决方案,如果第二个管道中的输出/下游数据集与第一个管道的时间片间隔不同,它将变得复杂。我建议测试并理解这一点。
真正的ADF不是为了做你想做的事。 不是一种对SQL代理作业中的步骤进行排序的工具。 ADF适用于规模和并行工作流。
正如我从微软的窃窃私语中所理解的那样,ADF中可能会有更多事件驱动的调度。但我不确定。
希望这有帮助。