1. 程式人生 > >SSISDB7:當前正在運行的Package及其Executable

SSISDB7:當前正在運行的Package及其Executable

gin monit and app join run rom process tin

PM問:“Vic,現在ETL Job跑到哪一個Package了,正在執行哪個Task?”,第一次遇到這個問題時,一下就懵逼了,只能硬著頭皮說:“我看看”。

在做項目開發時,這個問題很常見,但是,被很多ETL開發工程師忽略了,可能是因為,這不是一個直接可以給出答案的命題。

在做大數據處理時,ETL Package開發工程師經常會用到管理者模式(Manager Mode)設計Package,也就是說,管理者Package調用子Package,通過優先約束控制子Package的並發調用和執行順序,這種模式在管理大量Package的ETL工程時十分有用。當使用該模式的Packages被部署到SQL Server時,開發人員只需要創建一個Job,設置調度(Schedule),那麽大管家(Agent)就會自動調用Package,完成數據的處理,高枕無憂。

除了部署方便之外,管理者模式也能縮短ETL整體運行的時間。在ETL Package調度的設計上,經常會使用並發執行模式:Task 並發執行,Package並發執行。對於Package的並發執行模式,實現方式是:在SSIS Server上部署Package Job,每個Job Step執行一個Manager Package ,該Manager Package 以並發方式調用Execute Package Task,因此,在同一時間存在多個Child Packages同時運行,每一個子Package都是一個Executable文件,並發執行的Executable的最大值是CPU的數量。

通常情況下,查看Job的執行情況,都會使用Job Activity Monitor,但是,只能看到單個Job的執行的歷史消息,當Package 運行出現異常時,開發人員單純通過Monitor,看不到當前正在運行的Package和其他更底層的消息。那麽,在Job運行的過程中,如何查看正在運行的Package呢? 答案是通過SSISDB記錄的消息。在Project 部署模式下,在任何一個Package執行時,SSIS引擎都會記錄Executable(Task,Container)在執行過程中產生的歷史消息,因此,可以通過SSIS記錄的operation message 和 executable 名字來判斷當前正在運行的Package。

SSIS 執行引擎使用SSISDB存儲Package執行的歷史消息,SSIS引擎把Package的執行抽象成一個操作(opertion),operation的類型主要是Project的部署,package執行和消息的清理(cleanup)。每次執行Package,SSIS執行引擎都會創建operation_type=200的operation,使用catalog.operations記錄對Package執行的operation,使用catalog.operation_messages視圖,記錄每個Package在執行過程中產生的歷史消息,消息描述的對象是Executable,每一個Executable是Package中的一個可執行組件,主要是Task和Container,通過Executable的名字,事件名稱,以及創建消息的時間,能夠推斷出當前正在執行的Executable,進而推斷出當前正在執行的Package。

如果有人看過我之前的博客,應該記得catalog.executables視圖,但是,從該視圖中,只能推斷出已經執行完成(Executed)的Executable,而不能推斷出正在執行(Executing)的Executable,所以,沒有捷徑直接得出結論,那我們就按部就班。

1,查看正在運行的operation

Integration Service Catalogs中Package執行的任何操作,都會記錄在 catalog.operations 視圖中,該視圖的關鍵字段是:

  • operation_type:operation_type=200 表示 create_execution and start_execution
  • Status:The status of the operation. The possible values are created (1), running (2), canceled (3), failed (4), pending (5), ended unexpectedly (6), succeeded (7), stopping (8), and completed (9).
  • object_type:The type of object affected by the operation. The object may be a folder (10), project (20), package (30), environment (40), or instance of execution (50).

懶得翻譯了,相信大家的英語水平,要查看當前正在運行的pperation,可以設置查詢條件:operation_type=200,status=2或5,object_type=20,每個opertion都有一個唯一的標識ID,通過該ID和opertaion message關聯,查詢腳本是:

select top 11 
    op.operation_id,
    opt.operation_type_descr,
    op.created_time,
    obt.object_type_descr as object_affected,
    op.object_id,
    op.object_name,
    ops.operation_status_descr as status,
    op.start_time,
    op.end_time,
    op.caller_name
from catalog.operations op with(nolock)
inner join helper.OperationType opt with(nolock)
    on op.operation_type=opt.operation_type
inner join helper.ObjectType obt with(nolock)
    on op.object_type=obt.object_type
inner join helper.OperationStatus ops with(nolock)
    on op.status=ops.operation_status
where op.operation_type=200  --create_execution and start_execution(200)
and op.object_type=20        -- project (20)
and op.status in(2,5)        -- running (2), pending (5)
order by op.created_time desc

2,查看SSIS Engine 記錄的Operation Message

SSIS 引擎是根據Executable觸發的事件(Event)來記錄Operation Message的,從message_type_descr能夠查看消息的 Event 類型,從message_source_descr中能夠看到觸發事件的Task 類型:Control Flow tasks 或 Data Flow task。

通過operation_id,關聯operation message,查看在package執行時,SSIS引擎記錄的Executable名字,確定當前正在執行的Executable,進而確定正在執行的Package。

MSDN對 catalog.operation_messages 的描述是:

This view displays a row for each message that is logged during an operation in the catalog. The message can be generated by the server, by the package execution process, or by the execution engine.

用來查看事件和組件名稱的查詢腳本是:

select top 111
    om.message,
    om.message_time,
    mt.message_type_descr,
    mst.message_source_descr
from catalog.operation_messages om with(nolock)
inner join helper.MessageType mt with(nolock)
    on om.message_type=mt.message_type
inner join helper.MessageSourceType mst with(nolock)
    on om.message_source_type=mst.message_source_type
where om.operation_id=104627
order by om.message_time desc

Message字段提供的信息非常詳細,格式大概是:Task組件名稱+事件名稱+其他,通過組件名稱,推測正在運行的Package和組件。如果Task 組件的名稱具有代表性,就能很容易推斷出正在運行的Package 和 Package中正在運行的task。

3,helper 輔助表

關於helper 輔助表,請參考《SSISDB6:Operation》的“Appendix”

參考doc:

catalog.operation_messages (SSISDB Database)

catalog.operations (SSISDB Database)

SSISDB7:當前正在運行的Package及其Executable