数据流组件的设计愿景是快速处理海量的数据,为了实现该目标,SSIS数据源引擎需要创建执行树和数据管道这两个数据结构,而用户为了快速处理数据流,必须知道各个转换组件的阻塞性,充分利用流式处理流程,利用更少的资源,更快地完成数据处理的任务。

一,执行树

执行树(Execution Tree)是数据流组件(转换和适配器)基于同步关系所建立的逻辑分组,每一个分组都是一个执行树的开始和结束,也可以把执行树理解为一个缓冲区的开始和结束,执行树是一个缓冲区的整个生命周期。每一个执行树能被单独的进程执行,并可以和其他执行树同时并发执行。每一个执行树都对应一个数据缓冲区,该缓存区由数据流管道引擎创建,和执行树的生命周期相同。

大家知道,异步转换组件会结束输入缓冲区,创建新的输出缓冲区,所以,执行树的分组实际上通过异步转换组件来划分的,一个异步转换组件意味着上游执行树的结束和下游执行树的开始。当数据流经过异步转换组件,进入一个新的执行树,上一个执行树的缓冲区和相同数据就不再需要了,因为数据已经被传递到一个新的执行树和一组新的缓冲区中。

在执行树运行期间,数据源组件读取数据,把数据存储到缓存区中,然后转换组件逐个处理缓存中的数据,此时,不需要移动缓冲区,只需要变换转换组件。

During execution of the execution tree, the source reads the data, then stores the data to a buffer, executes the transformation in the buffer and passes the buffer to the next execution tree in the path by passing the pointers to the buffers.

1,缓冲区配置文件

在执行Package时,缓冲区管理器根据Package中的执行树来定义缓冲区配置文件。一个特定的执行树中的所有组件使用的缓冲区配置文件是相同的。当为每个执行树定义缓冲区配置文件时,SSIS缓冲区管理器会查看执行树中所有的转换组件,并在缓冲区中包括所有转换组件需要的每一个字段(Column),这就意味着某些列在初始转换或适配器(源和目的组件)中没有被使用,缓冲区仍然会为这些列分配空间。

优化数据流可以看作是优化关系表,列的宽度和数量越少,缓冲区容纳的数据行数越多。

2,EngineThreads 属性

如果线程可用,并且执行树需要较高的CPU利用率,那么线程调度程序可以为单个执行树分配多个线程。每个转换和适配器(源和目的)都可以接收一个线程,所以如果执行树有N个组件,那么它最多可以拥有N个线程。

数据流任务(Task)有 EngineThreads 属性,用于设置数据流任务中所有执行树在同一时刻能够使用的最大线程数。根据执行树的复杂性,为执行树分配单个或多个线程,能够提高数据流的执行效率。

二,数据管道  

管道(Pipeline)是一种“链式模型”,按照一定的顺序,串接不同的程序或者不同的组件,把它们组成一条直线的工作流。对于一个完整的输入,经过各个组件的先后协同处理,得到唯一的最终输出。

管道的模型图是流式的,如下图,就像一条生产线一样,各个组件独立完成特定的目的,并把处理的结果上交到下一层。

SSIS的数据管道(Data Pipeline)是数据流处理的关键功能,如下图所示,数据管道使用内存Buffer来提高处理性能,它能够并发处理数据,减少或消除数据的传递,也就是说,多个转换组件使用同一个缓冲区进行数据处理,减少数据的读写操作。而流式处理的特性,使得数据管道有能力处理海量的数据,而不需要很大的内存资源。

 三,转换的阻塞性

根据转换的阻塞性,把转换组件分为阻塞转换和流式转换,或者分为同步转换和异步转换:

  • 同步转换,是指组件在处理每个输入行的同时能够把已经处理的数据向下游传递,这意味着,输出行与输入行同步(输入和输出行之间关系是1:1对应的),因此它使用相同的已分配的内存缓冲区,不需要额外的内存。 同步转换需要较低的内存需求,因为它们逐行工作(因此运行速度更快),并且不会阻塞管道中的数据流。 具有同步特性的组件是:查找(Lookup),派生列,数据转换,复制列,多播,行数转换等。
  • 异步转换,是指组件要等到所有的输入行都存储到缓存区之后,才开始处理数据,然后把处理完成的数据向下游传递,例如,对于聚合转换,它需要在聚合并生成输出行之前把所有的输入行都加载和存储在内存中。通过这种方式,您可以看到输入行与输出行不同步,并且需要更多内存来存储数据输入和输出的整个数据集(无内存重用)。 这种转换具有更高的内存要求(如果内存不足,缓冲后台处理的可能性很高),并且运行速度通常较慢。 异步转换也称为“阻塞转换”,因为它的性质是阻止输出行,除非所有输入行都被读入内存。

对于异步转换组件,可以进一步细分为两种类型:部分阻塞和全阻塞:

  • 部分阻塞转换:在输入数据完全读取之前,转换不会阻塞输出。因为这些变换的输出与输入集不同,因此部分阻塞转换需要分配新的缓冲区来存储新创建的结果集。例如,合并联合转换会连接两个已排序的输入并生成合并输出。 在这种情况下,如果您注意到,数据流管道引擎会创建两个输入内存集,但来自变换的合并输出需要另一组输出缓冲区作为与输入行不同的输出行结构。 这意味着此类转换的内存要求高于转换完成的同步转换。
  • 全阻塞转换:除了需要额外的输出缓冲区外,全阻塞转换也会完全阻止输出,除非读取整个输入集合。 例如,排序转换要求所有输入行都加载到缓冲区中,才能开始排序并将有序行传递到输出路径。这些转换是最耗费资源的,只能在不得已的情况下使用,例如,如果您可以从源系统获取已排序的数据,那么请使用该逻辑,而不是使用排序转换对传输到内存中的数据进行排序。

参考文档:

SSIS Process Control

SSIS Architecture and Internals Interview Questions

SSIS 数据流的执行树和数据管道的更多相关文章

  1. PB数据管道

    数据管道提供了一种不同数据库之间传递数据和(或)表结构的方法. 数据管道对象 要完毕数据管道的功能须要提供例如以下内容: 须要数据源和目标数据库,并可以和这两个数据库正常联接 须要源数据库中的哪些表: ...

  2. SSIS 数据流优化

    一,数据流设计优化 数据流有两个特性:流和在内存缓冲区中处理数据,根据数据流的这两个特性,对数据流进行优化. 1,流,同时对数据进行提取,转换和加载操作 流,就是在source提取数据时,转换组件处理 ...

  3. SSIS 系列 - 在 SSIS 中使用 Multicast Task 将数据源数据同时写入多个目标表,备份数据表,以及写入Audit 信息

    转自http://www.cnblogs.com/biwork/p/3328838.html 在 SSIS Data Flow 中有一个 Multicast 组件,它的作用和 Merge, Merge ...

  4. 微软BI 之SSIS 系列 - 使用 Multicast Task 将数据同时写入多个目标表,以及写入Audit 与增量处理信息

    开篇介绍 在 SSIS Data Flow 中有一个 Multicast 组件,它的作用和 Merge, Merge Join 或者 Union All 等合并数据流组件对比起来作用正好相反.非常直观 ...

  5. Kafka连接器建立数据管道

    1.概述 最近,有同学留言咨询Kafka连接器的相关内容,今天笔者给大家分享一下Kafka连接器建立数据管道的相关内容. 2.内容 Kafka连接器是一种用于Kafka系统和其他系统之间进行功能扩展. ...

  6. c#直接调用ssis包实现Sql Server的数据导入功能

    调用ssis包实现Sql Server的数据导入功能网上已经有很多人讨论过,自己参考后也动手实现了一下,上一次笔者的项目中还用了一下这个功能.思前想后,决定还是贴一下增强记忆,高手请54. 1.直接调 ...

  7. Apache Beam实战指南 | 大数据管道(pipeline)设计及实践

    Apache Beam实战指南 | 大数据管道(pipeline)设计及实践  mp.weixin.qq.com 策划 & 审校 | Natalie作者 | 张海涛编辑 | LindaAI 前 ...

  8. 【tensorflow2.0】数据管道dataset

    如果需要训练的数据大小不大,例如不到1G,那么可以直接全部读入内存中进行训练,这样一般效率最高. 但如果需要训练的数据很大,例如超过10G,无法一次载入内存,那么通常需要在训练的过程中分批逐渐读入. ...

  9. SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)

    本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...

随机推荐

  1. Man's Best Friend: The Science Behind the Dog and Human Relationship

    http://info.thinkfun.com/stem-education/mans-best-friend-the-science-behind-the-dog-and-human-relati ...

  2. zabbix的日常监控-API

    Zabbix API提供两项主要功能: 远程管理Zabbix配置 远程检索配置和历史数据 官方文档:https://www.zabbix.com/documentation/3.4/zh/manual ...

  3. September 04th 2017 Week 36th Monday

    Try not to become a man of success but rather try to become a man of value. 不要努力去做一个成功的人,而要努力去做一个有价值 ...

  4. windows下python 正确安装词云包wordcloud的方法

    安装wordcloud的时候果然还是出现了问题,试了网上说的好多办法,最后找到了一种成功率高的,可以优先尝试一下 下载.whl文件http://www.lfd.uci.edu/~gohlke/pyth ...

  5. PHP设计模式系列 - 装饰器

    什么是装饰器 装饰器模式,对已有对象的部分内容或者功能进行调整,但是不需要修改原始对象结构,可以使用装饰器设 应用场景 设计一个UserInfo类,里面有UserInfo数组,用于存储用户名信息 通过 ...

  6. 【收集】Python 微优化

    1. 第二种方式可以节省寻找result的append属性的时间, 但会降低代码可读性和可维护性 # The way we're used to seeing it: result.append(&q ...

  7. Objective-C 与命名空间

    http://blog.csdn.net/michelle__/article/details/52528172 Objective-C 在Objective-C应用中的所有类名都必须是全局唯一的.命 ...

  8. 整合Yolov3到游戏引擎

    这篇其实是前文 CUDA版Grabcut的实现 的后续,和上文一样,先放视频. (博客园好像不支持视频,gif文件太大,视频链接) 在上文用CUDA实现opencv下的grabcut后,当时问题主要是 ...

  9. Redis基本数据类型命令汇总

    前言   前阶段写Redis客户端作为学习和了解Redis Protocol,基本上把Strintg,List,Hash,Set,SortedSet五种基础类型的命令都写完了,本篇进行总结,也相当于复 ...

  10. Google 地图切片URL地址解析

    一.Google地图切片的投影方式及瓦片索引机制 1.地图投影 Google地图采用的是Web墨卡托投影(如下图),为了方便忽略了两极变形较大的地区,把世界地图做成了一个边长等于赤道周长的正方形(赤道 ...