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 视图中,该视图的关键字段是:
懒得翻译了,相信大家的英语水平,要查看当前正在运行的 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
- fromcatalog.operations opwith(nolock)
- inner joinhelper.OperationType optwith(nolock)
- onop.operation_type=opt.operation_type
- inner joinhelper.ObjectType obtwith(nolock)
- onop.object_type=obt.object_type
- inner joinhelper.OperationStatus opswith(nolock)
- onop.status=ops.operation_status
- whereop.operation_type=200 --create_execution and start_execution(200)
- andop.object_type=20 -- project (20)
- andop.statusin(2,5)-- running (2), pending (5)
- order byop.created_timedesc
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
- fromcatalog.operation_messages omwith(nolock)
- inner joinhelper.MessageType mtwith(nolock)
- onom.message_type=mt.message_type
- inner joinhelper.MessageSourceType mstwith(nolock)
- onom.message_source_type=mst.message_source_type
- whereom.operation_id=104627
- order byom.message_timedesc
Message 字段提供的信息非常详细,格式大概是:Task 组件名称 + 事件名称 + 其他,通过组件名称,推测正在运行的 Package 和组件。如果 Task 组件的名称具有代表性,就能很容易推断出正在运行的 Package 和 Package 中正在运行的 task。
3,helper 辅助表
关于 helper 辅助表,请参考《SSISDB6:Operation》的 "Appendix"
参考 doc:
catalog.operation_messages (SSISDB Database)
catalog.operations (SSISDB Database)
来源: http://www.cnblogs.com/ljhdo/p/5474307.html