开篇介绍

通常一个 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 流程的重用性的更多相关文章

  1. 微软BI 之SSRS 系列 - 如何设置页标题重复

    开篇介绍 这个问题大家经常碰到,特意写一下如何解决这个小问题. 问题 默认情况下当报表超过一定的高度会自动分成多页. 第二页默认是看不到标题的. 解决方法 2012版本下在 Column Groups ...

  2. 微软BI 之SSAS 系列 - 多维数据集中度量值设计时的聚合函数 (累加性_半累加性和非累加性)

    在 SSAS 系列 - 实现第一个 Cube 以及角色扮演维度,度量值格式化和计算成员的创建 中主要是通过已存在的维度和事实数据创建了一个多维数据集,并同时解释了 Role-Playing Dimen ...

  3. 微软BI 之SSAS 系列 - 自定义的日期维度设计

    SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ...

  4. 微软BI 之SSAS 系列 - 实现Cube 以及角色扮演维度,度量值格式化和计算成员的创建

    在熟悉完下面这三种维度的创建方式之后,就可以开始创建我们的第一个 Cube 了. SSAS 系列 - 自定义的日期维度设计 SSAS 系列 - 基于雪花模型的维度设计 SSAS系列 - 关于父子维度的 ...

  5. 微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

    SSRS 中并没有直接提供本地化的配置方式,因此在 SSRS 中实现本地化,比如有英文标题还有可选的中文标题,就需要通过其它的方式来解决. 比如默认是这样的英文标题 - 但是本地中方用户可能比较喜欢看 ...

  6. 微软BI 之SSRS 系列 - 巧用 RunningValue 函数在分组中排序并设置 RANK 排名

    开篇介绍 经常有像类似于这样的排序需求,以及设置分组下的排序序号.比如此图中要求城市 City 在省份下按照 Internet Sales Amount 总销售额进行排序,并标识在各省份下的排名. 实 ...

  7. 微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计

    来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现?   SSRS 2008.2 ...

  8. 微软BI 之SSRS 系列 - 报表邮件订阅中 SMTP 服务器匿名访问与 Windows验证, 以及如何成功订阅报表的实例

    这篇文章源于在上一篇博文中有园友提出订阅 SSRS 报表时的一个问题,  于是就好好总结了一下,把有关 SSRS 报表订阅的要点和容易出现问题的地方写出来,希望对大家有所帮助! 参看上一篇博文 - S ...

  9. 微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果

    开篇介绍 如何在 SSRS 报表中实现标签导航 Navigation 和向下钻取 Drill Down的效果? 如同下面这个例子一样 - 在页面第一次加载的时候,默认显示是全部地区的销售总和情况,上面 ...

随机推荐

  1. unity3d使用脚本保存屏幕截图

    using UnityEngine; using System.Collections; using System.IO; public class FrameAnimation : MonoBeha ...

  2. 第三章 深入 ZAB 协议

    上一节介绍了ZAB协议的内容,本节将从系统模型.问题描述.算法描述和运行分析四方面来深入了解 ZAB 协议. 系统模型 在一个由一组进程 n ={P1,P2,...Pn}组成的分布式系统中,每一个进程 ...

  3. Top Data Scientists to Follow & Best Data Science Tutorials on GitHub

    http://www.analyticsvidhya.com/blog/2015/07/github-special-data-scientists-to-follow-best-tutorials/ ...

  4. 团队博客作业Week1

    Study the projects done by previous student groups - View their blog site, use their software, email ...

  5. js中json对象的深拷贝

    /** * 对象深拷贝 * @param obj */ function deepCopy(obj) { var txt=JSON.stringify(obj); return JSON.parse( ...

  6. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用

    最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...

  7. MySQL设置字符集CHARACTER SET

    本文地址:http://www.cnblogs.com/yhLinux/p/4036506.html 在 my.cnf 配置文件中设置相关选项,改变为相应的character set. 设置数据库编码 ...

  8. Yaf零基础学习总结3-Hello Yaf

    Yaf零基础学习总结3-Hello Yaf 上一次我们已经学习了如何安装yaf了,准备工作做好了之后我们来开始实际的编码了,码农都知道一个经典的语句就是“Hello World”了,今天我们开始入手Y ...

  9. 第五天:内置对象(7.Javascript内置对象)

    1)中所术是内置对象,2)中为自定义对象 代码说明如下 2.1.1 定义并创建对象实例方式1,代码如下: <!DOCTYPE html><html lang="en&quo ...

  10. 【原创】“借贷宝”砸钱,邀请码 GZZKZK2 (注册成功每人可得20现金,可直接提现)。。。而这只是开始

    作为IT/互联网资深码农的我,从专业技术角度剖析其流程,确认其各个环节控制严格,无欺诈嫌疑, 最佳运气邀请码 : GZZKZK2, 你在注册时值得拥有, 无邀请码无奖励, 亲一定要记住.对 APP操作 ...