在数据集成和ETL(Extract, Transform, Load)领域,性能优化是一个永恒的话题。为了提高数据处理的效率,Microsoft在2011年6月7日发布了一个新的SSIS 2008转换组件——平衡数据分发器(Balanced Data Distributor,简称BDD)。这个组件通过多线程技术,能够将单一数据流几乎均匀地分配到多个目的地。本文将详细介绍BDD的工作原理、如何将其添加到SSIS工具箱中、一个使用示例,以及在何种情况下应该使用BDD。
根据官方文档的描述,BDD组件接受单一输入,并通过多线程技术将数据流均匀地分配到多个目的地。该转换器每次处理一个数据流缓冲区的行,然后以轮询的方式将其移动到下一个输出。由于它是平衡和同步的,如果下游的某个转换器或目的地比其他的慢,整个数据流将会停滞。因此,当所有输出都具有相同的转换和目的地时,BDD的效果最佳。BDD的目的是利用多线程提高性能。BDD适用于以下场景:1) 目的地是统一的,或者至少是相同类型的;2) 输入速度大于输出速度,例如从平面文件读取到OleDB。
值得注意的是,BDD仅支持SSIS2008和SSIS 2008 R2版本。
安装BalancedDataDistributor-x86.exe文件后,需要将其添加到数据流转换工具箱中。以下是添加步骤:
此时,BDD将被添加到数据流转换部分。
BDD接受单一输入,并尝试将其数据几乎等比例地分配到各个输出。例如,如果有5个输出,那么每个输出组件将接收大约1/5的总输入数据。BDD的效率来自于它操作的是数据缓冲区,而不是单独的行。
假设有一个名为input.txt的文本文件,包含100万(10,00,000)行数据。这是一个简单的文本文件,包含一些员工信息,如EmpID(员工ID)、EmpName(员工姓名)、EmpSex(员工性别)和EmpPhoneNumber(员工电话号码)。
可以发现,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提高了数据转换的速度。因此,在多处理器配置上使用它比在单处理器配置上更好。