微软BI 之SSIS 系列 - 通过设置 CheckPoints 检查点来增强 SSIS Package 流程的重用性
开篇介绍
通常一个 ETL Package 是由多个控制流和数据流共同组成,有的时候 ETL 的步骤可能会比较多,整个流程执行下来的时间可能比较长。假设在 ETL Package 中包含5个Task,前3个Task执行超过1个小时,到了第4个Task的时候发生失败。如果下次执行的时候重新从第1个任务开始执行,那么又要花费1个小时等待 1-3 任务执行,无疑在效率上讲是非常低的。特别是在数据仓库的应用上,往往从数据源到Staging的过程中有千万级甚至亿级的数据要加载,加载完毕之后再进入到维度和事实表。如果在进入维度和事实表的过程中发生失败,就意味着下次需要重新加载数据到Staging表。而通过检查点CheckPoint的设置可以解决这个问题,通过合理的设置可以跳过上一次已经成功执行过一些步骤而直接从失败的地方重新开始执行,这样大大的提高了包的执行效率。
案例演示
下面这个 ETL 示例简单的模拟了从一个数据源抽取数据然后输出到一个数据表和一个平面文件的过程,之后再看 CheckPoint 的使用。
USE BIWORK_SSIS
GO IF OBJECT_ID('CK_Address') IS NOT NULL
DROP TABLE CK_Address
GO IF OBJECT_ID('CK_AddressAudit') IS NOT NULL
DROP TABLE CK_AddressAudit
GO CREATE TABLE CK_Address
(
AddressID INT,
AddressLine1 NVARCHAR(60),
AddressLine2 NVARCHAR(60),
City NVARCHAR(30)
) CREATE TABLE CK_AddressAudit
(
ID INT PRIMARY KEY IDENTITY(1,1),
CityName NVARCHAR(60),
Counts INT
)
ETL 过程 -
- EST_TruncateAddress - TRUNCATE TABLE dbo.CK_Address TRUNCATE TABLE dbo.CK_AddressAudit
- DFT_LoadAddress - 从 AdventureWorks2012.People.Address 中抽取数据到 dbo.CK_Address 中
- DFT_SaveAddressAudit - 对 CK_Address 表中的数据做出一些统计然后写入到 dbo.CK_AddressAudit 中
- DFT_OutputAddressAudit - 将 dbo.CK_AddressAudit 中的数据输出到一个文本文件中

输出结果- CK_Address 和 CK_AddressAudit

输出的文件

假设在最后一个步骤发生错误,那么在下次执行 Package 的时候,前面所有的步骤都需要被重新执行。

CheckPoint 的设置过程
通过设置 CheckPoints 可以解决这个问题,要使用检查点首先要在包中开启检查点这一功能,并且可以在相应的容器和控制流 Task 中写检查点。
第一步,找到 SSIS Package 的属性,设置 SaveCheckPoints 属性为 Ture,这样就允许 SSIS Package 在执行过程中保存检查点。

第二步,在 CheckPointFileName 属性中,提供一个文件名和路径,这样 SSIS Package 就会用这个文件来维护执行过程中的状态信息。假设一个包执行失败了然后重新启动它,那么包就可以读这个检查点文件来找到最后一次执行成功的 Task 然后决定从哪里开始重新执行,一个包只能有一个检查文件。
第三步,设置 CheckpointUsage 属性为 IfExists。这样如果检查点文件不存在的时候包会从头开始执行,如果存在就会根据相应的状态信息从指定的 Task 开始执行。

第四步,当在包中启用了检查点信息的话,最后的一个步骤就是在包中各种 Task 上来设置检查点,这时需要将相应的容器或者Task的 FailPackageOnFailure 属性设置为 True,此处修改的是 DFT_OutputAddressAudit 属性。

设置保存完 SSIS Package 之后再次运行,仍然在 DFT_OutputAddressAudit 处会发生错误,并且 SSIS Package 会输出一个检查点文件。

可以看看这个检查点文件。
<DTS:Checkpoint xmlns:DTS="www.microsoft.com/SqlServer/Dts" DTS:PackageID="{66363AAC-346A-4225-BE24-34538C1DF296}">
<DTS:Variables DTS:ContID="{66363AAC-346A-4225-BE24-34538C1DF296}"/>
<DTS:Container DTS:ContID="{FCABC727-26BD-4C73-AA26-2B31BCC2C3E1}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
<DTS:Container DTS:ContID="{11182445-3759-4699-88E8-345105620B53}" DTS:Result="0" DTS:PrecedenceMap=""/>
<DTS:Container DTS:ContID="{DA2ED97D-2D6E-4401-A36E-1A9A28B51C37}" DTS:Result="0" DTS:PrecedenceMap=""/>
<DTS:Container DTS:ContID="{5DC475B3-C3DC-4118-8116-4DC1FF8CA5E2}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
</DTS:Checkpoint>
修改好 DFT_OutputAddressAudit 然后再次运行,发现这次直接是从 DFT_OutputAddressAudit 处开始执行,这样就不需要重复执行已经成功过的步骤。

执行成功之后,这个检查点文件将会被 SSIS Package 删除掉。

CheckPoint 执行过程解析
启用了检查点的 Package 在重新执行的时候它的执行过程通常是这样的:
第一步,检查 Checkpoints 文件是否存在。如果不存在的话,那么包将从头开始执行。如果存在,包将读取这个文件并找到应该从哪一个 Task 开始执行。并且也会从中读取一些有关如何从上一次失败的时候要如何更新相应的变量和连接信息。
第二步,更新每一个设置过 Checkpoint (FailPackageOnFailure = True) 的那些已经执行成功的Task的状态,记录下来更新到 Checkpoint 文件。
第三步,如果包执行失败,那么 Checkpoint 文件将不会改变并只会保留上一次执行成功的 Task 的信息。
第四步,如果包执行成功,那么 Checkpoint 文件就会被删除掉。那么下一次包再运行的时候,Checkpoint 文件将不会存在,这样包又会继续从第一个 Task 开始执行。
如果将 CheckpointUsage 属性设置为 Always, 那么检查文件必须存在否则包将不会执行。另外,如果包设置了 TransactionOption = Required 的话,将不允许使用 Checkpoints 这一机制。
在一个包有着非常多而复杂的子流程情况下,无疑通过启用检查点将会节省大量的时间,因为它可以跳过那些在上一次已经成功的 Task 而直接从失败的 Task 那里重新执行。当然在 Data Flow Task 上可以设置检查点,但是对于在 Data Flow Task 内部将不能设置,因为 Checkpoint 只支持到 Control Flow Task 这一层,而不会支持 Data Flow 这一层。
更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。
微软BI 之SSIS 系列 - 通过设置 CheckPoints 检查点来增强 SSIS Package 流程的重用性的更多相关文章
- 微软BI 之SSRS 系列 - 如何设置页标题重复
开篇介绍 这个问题大家经常碰到,特意写一下如何解决这个小问题. 问题 默认情况下当报表超过一定的高度会自动分成多页. 第二页默认是看不到标题的. 解决方法 2012版本下在 Column Groups ...
- 微软BI 之SSAS 系列 - 多维数据集中度量值设计时的聚合函数 (累加性_半累加性和非累加性)
在 SSAS 系列 - 实现第一个 Cube 以及角色扮演维度,度量值格式化和计算成员的创建 中主要是通过已存在的维度和事实数据创建了一个多维数据集,并同时解释了 Role-Playing Dimen ...
- 微软BI 之SSAS 系列 - 自定义的日期维度设计
SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ...
- 微软BI 之SSAS 系列 - 实现Cube 以及角色扮演维度,度量值格式化和计算成员的创建
在熟悉完下面这三种维度的创建方式之后,就可以开始创建我们的第一个 Cube 了. SSAS 系列 - 自定义的日期维度设计 SSAS 系列 - 基于雪花模型的维度设计 SSAS系列 - 关于父子维度的 ...
- 微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换
SSRS 中并没有直接提供本地化的配置方式,因此在 SSRS 中实现本地化,比如有英文标题还有可选的中文标题,就需要通过其它的方式来解决. 比如默认是这样的英文标题 - 但是本地中方用户可能比较喜欢看 ...
- 微软BI 之SSRS 系列 - 巧用 RunningValue 函数在分组中排序并设置 RANK 排名
开篇介绍 经常有像类似于这样的排序需求,以及设置分组下的排序序号.比如此图中要求城市 City 在省份下按照 Internet Sales Amount 总销售额进行排序,并标识在各省份下的排名. 实 ...
- 微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计
来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现? SSRS 2008.2 ...
- 微软BI 之SSRS 系列 - 报表邮件订阅中 SMTP 服务器匿名访问与 Windows验证, 以及如何成功订阅报表的实例
这篇文章源于在上一篇博文中有园友提出订阅 SSRS 报表时的一个问题, 于是就好好总结了一下,把有关 SSRS 报表订阅的要点和容易出现问题的地方写出来,希望对大家有所帮助! 参看上一篇博文 - S ...
- 微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果
开篇介绍 如何在 SSRS 报表中实现标签导航 Navigation 和向下钻取 Drill Down的效果? 如同下面这个例子一样 - 在页面第一次加载的时候,默认显示是全部地区的销售总和情况,上面 ...
随机推荐
- jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门
一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...
- quick-cocos2d-x之testlua之VisibleRect.lua
require "extern" --这个类找到了可视区域的9个点的坐标:左上.上的中点.右上.左的中点.左下.下的中点.右下.右的中点.一般用于使用相对坐标的场合,解决自适应屏幕 ...
- Oracle 的基本使用--基本命令<一>
sql*plus 的常用命令 连接命令 1.conn[ect] 用法:conn 用户名/密码@网络服务名[as sysdba/sysoper]当用特权用户身份连接时,必须带上 as sysdba 或是 ...
- 今天想用jquery来实现div的拖放功能
html5标签.拖放(Drag 和 drop)是 HTML5 标准的组成部分. 步骤一:首先设置标签可以被拖 draggable="true" 步骤二:选取被拖的标签,和要放置被拖 ...
- [Linux]CentOS下安装和使用tmux
前天随意点开博客园,看到了一篇关于tmux的文章 Tmux - Linux从业者必备利器,特意还点进去看了.毕竟Linux对于做游戏服务端开发的我来说,太熟悉不过了.不过我就粗略地看了一眼,就关掉了. ...
- discuz数据库表
http://faq.comsenz.com/library/database/x3/x3_index.htm discuz数据库表字典 Discuz X3各数据库表用途 pre_common_ ...
- 有关pascal的填充语句小技巧
背景 今天打代码,用了一次fillchar(a,sizeof(a),1); 结果a数组(of longint)所赋的值却不是1 探索 ···pascal program fillchartest; v ...
- React与ES6(三)ES6类和方法绑定
React与ES6系列: React与ES6(一)开篇介绍 React和ES6(二)ES6的类和ES7的property initializer React与ES6(三)ES6类和方法绑定 React ...
- Win7 远程 Ubuntu 桌面 mate desktop,并实现中文输入法
一. 安装mate desktop: $sudo apt-add-repository ppa:ubuntu-mate-dev/ppa $sudo apt-add-repository ppa:ubu ...
- 6.6 Android 编译机制的变迁
我们使用Java开发android,在编译打包APK文件时,会经过以下流程 Java编译器将应用中所有Java文件编译为class文件(JVM运行的是.class文件,而DVM是.dex文件) dx工 ...