首页 > 代码库 > BI - ETL运行时监控

BI - ETL运行时监控

对于任何事物而言,监督都是提高自身的有效手段,BI也是如此。从我个人的经验而言,BI的监督可以分为两类(欢迎拍砖讨论)运行时监督(Runtime Monitoring)数据仓库健康状况的监督(DW Healthy Monitoring)

1. 运行时监督

所谓运行时监督是指监督数据从数据源到流到数据仓库的过程,通俗来讲就是监督ETL的执行过程。我相信绝大多数的BI系统都具有该功能,区别只在于实现监控的方式以及监控信息的详细程度

2. 数据仓库健康状况监督

所谓数据仓库的健康状况监督,其实就是监控数据仓库的系统的各项指标:表记录数、存储的大小、碎片大小、索引使用率、面向数据仓库的查询的执行效率等信息,对于这一项监控,就跟人接触到的BI项目而言,很少有系统实现该功能

本文章只讨论运行时监控,后面会再另起一篇讨论关于数据仓库健康监控的文章。由于本人使用的ETL工具是基于微软SSIS的,所以所讨论的监控实现方式也只限于微软的SSIS

广义上说,一般有三种方式可以实现ETL运行时的监控:

基于SSIS事件处理器的实现方式

基于SSIS日志提供程序的实现方式

基于SSISDB的实现方式(只有在SQL Server 2012之后才有)

基于事件处理器

正如下图所展示的,一个SSIS包有4个选项卡:控制流、数据流、事件处理器以及包浏览器:

wKioL1RcjHXwBsEgAAC8N4k3HZY856.jpg

我们知道控制流上放置的所有task以及包本身都是所谓的executable,而事件处理器是特定于某个executable的。并且executable之间是可以组成层级关系的,比如一个ExecuteSQL Task被包含在ForLoop容器中,那么它们之间就会组成如下的层级关系:

wKiom1RcjCOhPcVTAACGu-mokMg003.jpg

对于具有层级关系的executable,事件处理器具有一个非常重要的特性:事件发生的时候会从自身一直往上层抛并触发响应的处理器。基于这个特性我们可以只在Package上加上事件处理器,则所有包内的task的事件都可以被捕获。

下面是几个经常被用到的事件:wKiom1Rci-vDkp09AAGY_OJIUXo116.jpg

当设计自定义的日志时,我们可以简单的利用OnError在任务出错是记录信息,利用OnPreExecute在任务刚开始是获取信息(如开始时间等),利用OnPostExecute获取任务要结束时的信息(如结束时间等),然后利用RowCount任务获取所处理的行数信息就可以构造如下一个简单的日志表:

wKioL1RcjKKDSNFuAAC2Mcp0F44376.jpg

基于日志提供程序

相对而言,使用SSIS自带的日志提供程序是一种比较简单的实现运行时监控的方式。在SSIS包上右击,在弹出的菜单中选择Logging就会出现以下的界面:

  1. Containers界面允许我们选择想要监控其运行的executabe

  2. Providers and Logs界面允许我们选择内置的日志提供程序,一般我们选择”SSISlog Provider for SQL Server”

如果我们选择了该提供程序,那么SSIS会自动将日志写入一个名为sysssislog的表中,而且该表必须已经存在,SSIS不会自动创建该表。幸运的是在msdb系统数据库的系统表中有该表,我们可以按照该表的结构在另外的数据库上创建该表,或者直接使用该数据库。

  1. Details界面允许我们选择要监控的事件

wKiom1RcjFigmW6cAAJJlBNa6KU581.jpg

然后下面就是一个实际的效果图:

wKiom1RcjHrDvvlgAANbN3eQpes696.jpg


BI - ETL运行时监控