在SSIS的体系结构中,Package是SSIS的最重要的部分,从本质上来讲,Package是一个有序地执行任务的单元。Package的核心是控制流(ControlFlow),用于协调包中所有组件的执行顺序。数据流(DataFlow)是控制流中的核心组件,用于把数据提取到服务器内存中,转换数据并把数据写入到目标结构中。
一,控制流
控制流用于协调包中所有组件的执行顺序,这些组件由Task和容器构成,并且受到优先约束的控制。
控制流由三大组件构成,分别是Task,容器和优先约束。
容器用于把Task集合到一起,除了视觉上的分组外,容器还允许用户定义作用域在容器范围内的变量和事件处理程序。
Task是一个独立的工作单元,为包提供了实现特定功能的接口。
优先约束不仅把Task连接到一起,而且指定Task执行的顺序。
Task按照优先约束(PrecedenceConstraint)规定的顺序执行下去。在一个Task工作之前,Package必须完成其前面Task,不管前面的Task执行的结果是成功、失败或者完成。
1,优先约束
优先约束是把Task连接到一起的连接器,而且定义了Task的执行顺序。优先约束定义了Task的执行路径和条件,只有满足优先约束的条件时,才能按照连接路径继续执行下一个Task。例如,在下图所示的控制流中,优先约束把ExecuteSQLTask和DataFlowTask连接到一起,并且规定只有ExecuteSQLTask都执行完成之后,才会执行DataFlowTask。
为两个Task创建优先约束,必须设置约束值或表达式,当约束值或表达式为True时,满足约束条件。
优先约束的求值运算(EvaluaTIonoperaTIon)有四种:
约束(Constraint),根据约束的结果来确定约束的状态
表达式(Expression),根据表达式的结果来确定约束的状态
表达式和约束(ExpressionandConstraint),根据表达式和约束结果的组合来确定约束的状态
表达式或约束(ExpressionorConstraint),根据表达式或约束的结果之一来确定约束的状态
根据约束选项的不同,约束值有Value和表达式两种类型:
当求值选项为约束时,约束值有:成功(Success)、失败(Failure)和完成(CompleTIon);
当求值选项为表达式时,需要用户编写表达式;
约束值共有三种有效值,他们的含义是:
成功约束:表示只有在前置任务或容器成功时,才会执行当前的任务;
失败约束:表示只有在前置任务或容器失败时,才会执行当前的任务;
完成约束:表示只有在前置任务或容器完成(不管失败或成功)时,才会指定当前的任务
当一个Task上创建了多个约束时,必须设置多个约束的逻辑组合。当设置为逻辑与时,多个优先约束同时为True,才满足优先约束的条件;当设置为逻辑或时,只要有一个约束为True,就满足优先约束的条件。多重约束使当前Task在前置任务都成功(逻辑与)的情况下,或者任意一个前置任务成功(逻辑或)的情况下执行。
2,优先约束控制Task的并发
控制流不能在Task组件之间传递数据,它担当Task的调度者,用于串行或并行执行任务。如果两个Task之间没有设置优先约束,那么这两个Task是并发执行的。在设计Package时,应该最大限度地提高Task组件的并发处理能力,这样能够充分利用服务器的系统资源,有助于减少ETL执行的时间。
3,Task组件通过优先约束保持同步
在Task组件之间设置优先约束,只有在上游Task执行完成之后,才会执行下游Task;在上游Task执行完成之前,下游Task不会执行。因此,Task是同步的。
Task的同步表现在两个方面:
Task之间:一个Task在将操作移交之前必须完成(成功,失败或完成),一个Task要想运行,其所有上游Task必须全部完成,否则不会执行。Task的执行顺序由优先约束定义。
单个Task:Task在执行完成之前,不会释放SSIS的执行线程,即执行SSISTask对服务器的线程资源是独占的,直至Task完成,否则不会释放线程资源。
二,数据流
数据流(DataFlow)是控制流中的核心组件,用于把数据提取到服务器内存中,转换数据并把数据写入到目标结构中。由于数据流任务把数据加载到服务器内存中进行转换,因此,SSIS属于内存中的ETL工具,这使得SSIS可以高效地执行数据的转换操作。数据流的核心功能是把数据提取到服务器的内存中,转换数据之后,把数据写入到另一个目的中。数据从源移动到目的,使用的是内存管道(Pipeline)。当数据在管道中时,你可以使用转换组件对这些数据进行清洗和处理。
数据流具有流的特性,数据的提取,转换和加载是同时进行的。SSIS引擎以流的形式对数据进行并发处理,这意味着数据不是一次性全部加载,而是划分为不重复的多个部分,组成一个流,源源不断地从上游组件流向下游组件。在数据流动的过程中,数据流的所有转换组件同时对数据流进行处理。上游组件处理完一批数据之后,交接给下游组件继续处理,同时,上游组件继续处理下一批数据。数据在组件之间流动,各个组件同时处理数据的不同部分,直到全部数据处理完成。
数据流具有反馈和自动调节的功能,如果下游组件的处理速度存在压力,那么SSIS将会向上游组件施加反向压力,SSIS引擎感受到压力,将启动自动调节机制,使上游组件的数据流动速度减缓,从而达到动态平衡。
数据流任务由四部分组成:源,转换、目的和路径,分别用于把数据加载到内存中,对内存中的数据进行转换,并内存中的数据转移到目标中,数据按照路径来“移动”:
源:用于指定外部数据源位置,把外部数据加载到内存中,向下游组件输出数据。
转换:转换是在内存中完成的,用于对管道中的数据进行更改,影响内存数据管道内的数据,是数据流的核心功能。
目的:在数据管道的终点,数据离开数据管道,把数据输出到外部存储。
路径:数据流组件之间的连线叫做路径,数据按照路径来转移,可以视为数据走的路线。
外部数据源是数据管道的源泉,通常表示为连接(ConnecTIon),SSIS通过连接去访问外部数据源,连接管理器用于设置连接的属性,主要是用于用于集中设置访问数据源的连接字符串,该连接管理器可以被多个组件共享,也可以被多个Package共享。
1,数据流的缓冲区
数据管道是数据流通的管道线,数据流使用内存暂时存储数据流中的数据,这意味着,把数据从外部源提取到SSIS引擎时,数据会存储在预先分配好的内存缓冲区中,可以根据数据行的宽度(一个row中所有column的字节数),设置DefaultBufferMaxRows属性调整缓存区可以容纳的最大数据行数量,或直接设置DefaultBufferSize属性来调整缓冲区的大小。
数据流的缓冲区可以理解为一个二维表,每行有固定的长度,每一列的位置都是固定的。SSIS引擎根据服务器的资源和压力,预先分配一组缓冲区,每一个缓冲区存储完整数据集的一个不重复子集。当对数据流进行转换处理时,SSIS引擎后台使用一种更为有效的方式:对同一个缓冲区,逐个应用转换组件,这比把转换后的数据复制到另一个缓冲区,然后应用下一个转换组件更为有效。不过,有些情况下,SSIS引擎需要复制缓冲区,甚至需要拦截数据流,然后对整个数据集进行转换处理,例如,聚合和排序。
SSIS引擎处理数据最理想的情况是:所有的转换施加在同一个缓冲区中,就地执行转换处理数据。但是,现实情况不总是理想的,有些转换组件需要复制缓冲区,才能向下游传递数据。
数据流通过转换组件时,SSIS引擎是否需要复制缓冲区,跟转换的阻塞特性和通信机制有关。
关键词标签:海量存储 文件存储 分布式存储 国产存储 私有云 企业级存储 软件定义存储