SSIS 平衡数据分发器(BDD)的介绍与应用

在数据集成和ETL(Extract, Transform, Load)领域,性能优化是一个永恒的话题。为了提高数据处理的效率,Microsoft在2011年6月7日发布了一个新的SSIS 2008转换组件——平衡数据分发器(Balanced Data Distributor,简称BDD)。这个组件通过多线程技术,能够将单一数据流几乎均匀地分配到多个目的地。本文将详细介绍BDD的工作原理、如何将其添加到SSIS工具箱中、一个使用示例,以及在何种情况下应该使用BDD。

BDD的工作原理

根据官方文档的描述,BDD组件接受单一输入,并通过多线程技术将数据流均匀地分配到多个目的地。该转换器每次处理一个数据流缓冲区的行,然后以轮询的方式将其移动到下一个输出。由于它是平衡和同步的,如果下游的某个转换器或目的地比其他的慢,整个数据流将会停滞。因此,当所有输出都具有相同的转换和目的地时,BDD的效果最佳。BDD的目的是利用多线程提高性能。BDD适用于以下场景:1) 目的地是统一的,或者至少是相同类型的;2) 输入速度大于输出速度,例如从平面文件读取到OleDB。

值得注意的是,BDD仅支持SSIS2008和SSIS 2008 R2版本。

BDD添加到SSIS工具箱

安装BalancedDataDistributor-x86.exe文件后,需要将其添加到数据流转换工具箱中。以下是添加步骤:

  1. 右键点击数据流转换,选择“选择项”(Choose Items)。
  2. 在弹出的“选择项”对话框中,选择“SSIS数据流项”(SSIS Data Flow Items)标签页,然后选择Balanced Data Distributor,最后点击“确定”(OK)。

此时,BDD将被添加到数据流转换部分。

使用示例

BDD接受单一输入,并尝试将其数据几乎等比例地分配到各个输出。例如,如果有5个输出,那么每个输出组件将接收大约1/5的总输入数据。BDD的效率来自于它操作的是数据缓冲区,而不是单独的行。

假设有一个名为input.txt的文本文件,包含100万(10,00,000)行数据。这是一个简单的文本文件,包含一些员工信息,如EmpID(员工ID)、EmpName(员工姓名)、EmpSex(员工性别)和EmpPhoneNumber(员工电话号码)。

  1. 打开BIDS,将数据流任务拖放到控制流设计器中。
  2. 在数据流设计器中,首先添加一个平面文件源,并指定input.txt文件作为其源。如果进行预览,输出(部分)将如下所示:
  3. 接下来,添加一个BDD,其源显然是平面文件源。
  4. 添加5个平面文件目的地,每个目的地的源都是BDD。分别为每个平面文件目的地组件指定目的地文件,分别为Output1.txt、Output2.txt、Output3.txt、Output4.txt和Output5.txt。设计应该如下所示:
  5. 现在让运行包,输出将如下所示:

可以发现,100万数据中,BDD在第一个输出组件中分配了2,04,240行数据,而其他组件接收了1,98,940行。如果将100万除以5,那么每个输出组件应该均匀接收2万行数据。但由于分配是通过多线程进行的,因此无法精确控制数据的划分。

现在如果打开输出文件,可以发现BDD是如何分配数据的,例如:

文件名 第一条记录 最后一条记录 总记录数
Output1.txt 1,Name1,Female,12345679 1000000,Name1000000,Male,13345678 2,04,240
Output2.txt 9948,Name9948,Male,12355626 964859,Name964859,Female,13310537 1,98,940
Output3.txt 19895,Name19895,Female,12365573 974806,Name974806,Male,13320484 1,98,940
Output4.txt 29842,Name29842,Male,12375520 984753,Name984753,Female,13330431 1,98,940
Output5.txt 39789,Name39789,Female,12385467 994700,Name994700,Male,13340378 1,98,940

BDD基于并行原理工作。它通过在多个线程上分配工作,提供了一种创建独立段的简便方法。

值得注意的是,该组件使用了一个内部缓冲区,大小为9,947行(根据实验,发现是这样的),并且是预设的。没有办法覆盖这个设置。作为证明,可以使用9,947(九千九百四十七)行而不是10万行作为输入文件的行数,并观察其行为。运行包后,会发现所有行都被转移到了第一个输出组件,而其他组件没有收到任何数据。

现在让将输入文件的行数从9,947增加到9,948(九千九百四十八)。运行包后,发现第一个输出组件接收了9,947行,而第二个输出组件接收了1行。

因此,可以推断出该组件有一些预定义的逻辑来将其输出组件分配行,这些逻辑已经被抽象化了。

何时使用BDD

当有大量数据需要快速读取时。

当数据没有排序依赖性时,因为BDD基于并行原理工作,而不是顺序。

在本文中,看到了BDD的优势,并了解了它的工作原理。观察到,通过利用并行性,BDD提高了数据转换的速度。因此,在多处理器配置上使用它比在单处理器配置上更好。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485