开篇介绍

通常一个 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. SAP 如何查看用户登录信息

    1.首先进入事务代码 SM19  配置审计参数文件 2.选择客户端,用户名,并且勾选过滤激活之后点击细节配置,进入如下界面: 配置完成之后,点击保存. 3.并且可以进入SM20界面,选择要查看的客户端 ...

  2. c++之socket,阻塞模式

    这里描述下socket的阻塞模式: 首先,socket有几个函数 socket() 创建socket bind() 绑定socket到一个地址 listen() 开启soket监听 accept()  ...

  3. c#开发Mongo笔记第八篇

    到今天为止,Mongo开发的权限管理系统功能就做完了,剩下的就是完善构架,优化结构,只是现在c#操作Mongo的各种操作基本都掌握了 说到权限管理系统,其实再简单不过了,在关系型数据的是时代,我们通常 ...

  4. 真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合

    真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合 博客分类: java 测试 单元测试SpringCC++C#  一.要解决的问题:     spring环境中 ...

  5. 10. Software, Software Engineering, water fall (瀑布模型),Code Complete等名词的来源

    ①.Software-软件”一词是20世纪60年代才出现的,软件Software——1958年由贝尔实验室的著名统计学家John Tukey 提出软件与硬件一起构成完整的计算机系统,它们是相互依存,缺 ...

  6. 对于C++窗口编译一闪而过的解决方法 (DEV CPP下)

    对于C++窗口编译一闪而过的解决方法 首先来看一个简单的程序(编译环境为 DEV C++.):  #include <iostream>  int main()  {      std:: ...

  7. Windows2003 SQL2005解决系统Administrator密码不知道的问题

    Windows2003 SQL2005解决系统Administrator密码不知道的问题 今天上班的时候,有个同事说不知道谁设置了开机密码,那台电脑一直没有开机密码的他现在进不了桌面 那台电脑没有光驱 ...

  8. 加载 CSS 时不影响页面渲染

    转自:http://www.oschina.net/translate/loading-css-without-blocking-render 本文展示了一种技术,它能通过异步下载样式表,以阻止它们的 ...

  9. Nim教程【三】

    这是国内第一个关于Nim的系列教程 (至少我百度和必应是没有找到类似的教程) 先说废话 有人说 Golang的编译器/工具链也学互联网行业跟风拿用户当测试,简直一点素质没有. 还有人说 Go社区的风气 ...

  10. [WinAPI] API 1 [桌面上画一个简单彩色图形]

    #include<Windows.h> void GdiOut(HDC hdc); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hP ...