PM問:“Vic,現(xiàn)在ETL Job跑到哪一個Package了,正在執(zhí)行哪個Task?”,第一次遇到這個問題時,一下就懵逼了,只能硬著頭皮說:“我看看”。
在做項目開發(fā)時,這個問題很常見,但是,被很多ETL開發(fā)工程師忽略了,可能是因為,這不是一個直接可以給出答案的命題。
在做大數(shù)據(jù)處理時,ETL Package開發(fā)工程師經(jīng)常會用到管理者模式(Manager Mode)設(shè)計Package,也就是說,管理者Package調(diào)用子Package,通過優(yōu)先約束控制子Package的并發(fā)調(diào)用和執(zhí)行順序,這種模式在管理大量Package的ETL工程時十分有用。當(dāng)使用該模式的Packages被部署到SQL Server時,開發(fā)人員只需要創(chuàng)建一個Job,設(shè)置調(diào)度(Schedule),那么大管家(Agent)就會自動調(diào)用Package,完成數(shù)據(jù)的處理,高枕無憂。
除了部署方便之外,管理者模式也能縮短ETL整體運行的時間。在ETL Package調(diào)度的設(shè)計上,經(jīng)常會使用并發(fā)執(zhí)行模式:Task 并發(fā)執(zhí)行,Package并發(fā)執(zhí)行。對于Package的并發(fā)執(zhí)行模式,實現(xiàn)方式是:在SSIS Server上部署Package Job,每個Job Step執(zhí)行一個Manager Package ,該Manager Package 以并發(fā)方式調(diào)用Execute Package Task,因此,在同一時間存在多個Child Packages同時運行,每一個子Package都是一個Executable文件,并發(fā)執(zhí)行的Executable的最大值是CPU的數(shù)量。
通常情況下,查看Job的執(zhí)行情況,都會使用Job Activity Monitor,但是,只能看到單個Job的執(zhí)行的歷史消息,當(dāng)Package 運行出現(xiàn)異常時,開發(fā)人員單純通過Monitor,看不到當(dāng)前正在運行的Package和其他更底層的消息。那么,在Job運行的過程中,如何查看正在運行的Package呢? 答案是通過SSISDB記錄的消息。在Project 部署模式下,在任何一個Package執(zhí)行時,SSIS引擎都會記錄Executable(Task,Container)在執(zhí)行過程中產(chǎn)生的歷史消息,因此,可以通過SSIS記錄的operation message 和 executable 名字來判斷當(dāng)前正在運行的Package。
SSIS 執(zhí)行引擎使用SSISDB存儲Package執(zhí)行的歷史消息,SSIS引擎把Package的執(zhí)行抽象成一個操作(opertion),operation的類型主要是Project的部署,package執(zhí)行和消息的清理(cleanup)。每次執(zhí)行Package,SSIS執(zhí)行引擎都會創(chuàng)建operation_type=200的operation,使用catalog.operations記錄對Package執(zhí)行的operation,使用catalog.operation_messages視圖,記錄每個Package在執(zhí)行過程中產(chǎn)生的歷史消息,消息描述的對象是Executable,每一個Executable是Package中的一個可執(zhí)行組件,主要是Task和Container,通過Executable的名字,事件名稱,以及創(chuàng)建消息的時間,能夠推斷出當(dāng)前正在執(zhí)行的Executable,進(jìn)而推斷出當(dāng)前正在執(zhí)行的Package。
如果有人看過我之前的博客,應(yīng)該記得catalog.executables視圖,但是,從該視圖中,只能推斷出已經(jīng)執(zhí)行完成(Executed)的Executable,而不能推斷出正在執(zhí)行(Executing)的Executable,所以,沒有捷徑直接得出結(jié)論,那我們就按部就班,上干貨,代碼多,文章有點枯燥,還請手下留情。
1,查看正在運行的operation
Integration Service Catalogs中Package執(zhí)行的任何操作,都會記錄在 catalog.operations 視圖中,該視圖的關(guān)鍵字段是: