SSISDB 系列随笔汇总:

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 辅助表,请参考《SSISDB2:Operation》的“Appendix”

参考doc:

catalog.operation_messages (SSISDB Database)

catalog.operations (SSISDB Database)

SSISDB7:查看当前正在运行的Package的更多相关文章

  1. SSISDB7:当前正在运行的Package及其Executable

    PM问:“Vic,现在ETL Job跑到哪一个Package了,正在执行哪个Task?”,第一次遇到这个问题时,一下就懵逼了,只能硬着头皮说:“我看看”. 在做项目开发时,这个问题很常见,但是,被很多 ...

  2. SSISDB4:当前正在运行的Package及其Executable

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  3. 在Linux中查看所有正在运行的进程

    可以使用ps命令.它能显示当前运行中进程的相关信息,包括进程的PID.Linux和UNIX都支持ps命令,显示所有运行中进程的相关信息. ps命令能提供一份当前进程的快照.如果想状态可以自动刷新,可以 ...

  4. 如何在Linux中查看所有正在运行的进程

    如何在Linux中查看所有正在运行的进程 FROM:http://os.51cto.com/art/201101/244090.htm 进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系 ...

  5. 如何通过web查看job的运行情况

    当我们将作业提交到hadoop 的集群上之后,我们会发现一个问题就是无法通过web查看job运行情况,比如启动了多少个map任务,启动多少个reduce任务啊,分配多少个conbiner等等.这些信息 ...

  6. Linux查看非root运行的进程

    Linux查看非root运行的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps -U root -u root -N PID TTY TIME CMD ...

  7. Linux查看当前正在运行的进程

    Linux查看当前正在运行的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps PID TTY TIME CMD 2576 pts/0 00:00:00 ...

  8. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到JVM的实时运行状态?

    https://alibaba.github.io/arthas/ Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决 ...

  9. 如何在命令提示符下编译运行含有Package的java文件

    这篇是大二自学Java的时候记下的笔记,中午回顾印象笔记的时候意外看到了这篇.看到多年前写下的文字,我想起那时候我对Java的懵懵懂懂,每天晚上在图书馆照着书写书上的示例代码,为一个中文分号绞尽脑汁, ...

随机推荐

  1. Android MVP 利用rxjava 避免向Model传入监听方法

    传统的MVP: 1.抽离出View的接口,即ILoginView. 2.抽离Model的接口,即ILoginModel. 3.抽离Presenter的接口,即ILoginPresenter. 4.实现 ...

  2. ng-repeat循环出来的部分调用同一个函数并且实现每个模块之间不能相互干扰

    使用场景:用ng-repeat几个部分,每个部分调用同一个函数,但是每个模块之间的功能不能相互干扰 问题:在用repeat实现.content块repeat的时候打算这样做:新建一个空的数组(nmbe ...

  3. Java 实现HTML富文本导出至word完美解决方案

    一. 问题的提出 最近用java开发一个科技项目信息管理系统,里面有一个根据项目申请书的模板填写项目申报信息的功能,有一个科技项目申请书word导出功能. 已有的实现方式:采用标准的jsp模板输出实现 ...

  4. PO,VO,BO,DTO,POJO(POCO),DAO的区别(转载)

    PO:persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录.好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. BO:business object业 ...

  5. vue-cli 组件的使用

    开始项目之前,先了解如何创建项目: http://www.cnblogs.com/pearl07/p/6247389.html 1,项目目录结构(路由是后来建的,将在下一篇使用路由,此处可忽略). 2 ...

  6. Task异步编程

    Task异步编程中,可以实现在等待耗时任务的同时,执行不依赖于该耗时任务结果的其他同步任务,提高效率. 1.Task异步编程方法签名及返回值: a) 签名有async 修饰符 b) 方法名以 Asyn ...

  7. Opencv算法学习二

    1.直方图:图片中像素值分布情况的坐标图. 直方图均衡化:按一定规律拉伸像素值,提高像素值少的点,增加原图的对比度,使人感觉更清晰的函数. equalizeHist( src, dst ); 2.ha ...

  8. 安卓调用百度地图api 错误 mcode参数不存在

    自己的手机app里用到了百度地图sdk,希望根据手机获得的坐标来逆向到百度地图的坐标. 根据api文档拼写了url,因为是移动端,说是要添加mcode参数,然后我的url看起来如下: http://a ...

  9. 解读ASP.NET 5 & MVC6系列(7):依赖注入

    在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Injection),ASP.NET 5正式将依赖注入进行了全功能的实现,以便开发人员能够开发更具弹性的组件程 ...

  10. 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图

    这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...