我正在尝试掌握数据工厂的概念,以了解日程活动是如何工作的,但我并没有真正了解太多。
假设我的工作流程如下:
-
我有一个代理(作为Windows服务构建)在客户端的机器上运行,计划每天凌晨1点从SAP源提取数据,然后将其放在Azure blob存储中。代理只试图提取昨天的数据。示例:今天(4月9日)凌晨1点运行的代理仅提取4月8日的全部数据。此代理与数据工厂无关。
-
假设代理获取每日数据(4月8日)并将其放入blob存储大约需要30分钟,这可能或多或少取决于数据的大小
-
我有一个Factory Pipepine(从2016-04-08T01:30:00Z起永远活动),它使用blob存储作为输入数据集,并安排一个活动将数据从blob存储复制到数据库。
输入数据集具有可用性选项作为每日频率:
"availability": {
"frequency": "Day",
"interval": 1
}
计划活动安排为每日频率:
"scheduler": {
"frequency": "Day",
"interval": 1
}
因此,根据工作流程,我的问题是:
凌晨1:30后,代理完成从SAP中提取数据,并将其作为输入数据集放入博客存储中。数据工厂如何知道4月8日的数据切片已经为数据工厂做好了准备。
如果数据在1:30之后还没有准备好,那么活动此时仍在运行呢?
如果我正确理解您的特定场景,并且您有权修改windows服务的代码,那么您的windows服务可以在完成后启动ADF管道。我正在做这样的事情,我需要控制我的管道何时开始。我有一份本地工作,从一些数据源提取数据,并将其放入azure sql数据库中。一旦完成,我需要开始我的管道,但我无法确切知道我的工作何时完成。因此,我在当地工作的最后一步是启动我的ADF管道。我在这里写了一篇关于如何做到这一点的文章——从.net启动一个azure数据工厂管道。
希望这能有所帮助。
如果你在Azure Blob存储中有每天出现的数据,你可以尝试使用日期文件夹(例如:…/yyyy/MM/dd/…)。数据工厂可以检测是否存在特定日期文件夹,以确定特定日期的切片是否准备好处理。如果数据工厂当天没有看到文件夹,它将不会执行该切片的管道。
我还建议将提取过程作为数据工厂处理的一部分,这样,如果提取失败,管道将不会进一步执行。
我希望这能有所帮助!
据我所知,Azure数据工厂目前不支持通过创建或更新blob来触发管道。
对于此工作流,解决方案是根据时间安排输入数据集。如果您确信数据提取将在凌晨1:30完成,那么您可以将作业安排在每天凌晨1:30运行(或者可能晚一点,以防提取时间过长。)要做到这一点,请将管道的开始时间设置为"2016-04-08T01:30:00Z"(UTC时间)。)您应该能够以这样一种方式编写输入数据集,即如果数据提取尚未完成,则作业将失败,这将使您能够注意到失败并重新运行它。活动将在计划时开始,并将尽快完成。有关在Azure Blob和Azure SQL之间移动数据的详细信息,请参阅此页面。您的工作流程看起来与该链接中的示例非常相似,只是您的频率为"天"。
根据本地数据的存储方式,可能值得考虑绕过Azure Blob,直接从预处理源移动数据。这是使用数据管理网关支持的,如本文所述。不幸的是,我不熟悉SAP,所以我无法提供更多关于它的信息。