ETL系统的设计

时间:2022-07-19 04:44:47

ETL系统的设计

摘 要 数据仓库是一个面向主题的、集成的、不可更新的且随时间不断变化的数据集合。而正确、稳定、高校的etl过程则是提高数据仓库的数据质量、保证数据分析的前提。本文即详细阐述了ETL系统设计的要点。

【关键词】数据仓库 ETL 数据源 模块

1 ETL总体设计

ETL总体设计的重点是关注对元数据进行设计。元数据是ETL工具的核心和枢纽,是对ETL内容的描述信息。它负责管理和维护与数据抽取相关的所有元数据信息,包括业务数据源、数据映射配置、数据仓库、转换函数、抽取任务、数据完整性约束和增量数据维护规则等元数据信息。元数据在ETL技术框架中的策略和作用如图1所示。

ETL总体设计要求从以下几个方面来设计考虑:

1.1 跨平台性

跨平台性首先要求ETL工具与平台无关,具备良好的可移植性和更广的适用范围;其次是支持业务数据源和数据仓库不同的异构环境,因此要求ETL工具支持跨平台性。

1.2 对数据源的支持

目前数据源种类繁多,有些是历史遗留下来的,有些是现在广泛应用的,主要包括以下数据源:Oracle数据库,Sybase数据库、DB2数据库、Informix数据库、Mysql数据库、SqlServer数据库、Access数据库、SAS统计分析数据库、PostgreSQL数据库、SPSS统计分析数据、Excel文件、文本文件、XML文件等。在ETL工具设计时,要考虑尽可能支持多种类的数据源。

1.3 可扩展性

可扩展性主要是考虑有部分用户可能根据自己个性化的业务需求,需要扩展该ETL系统功能。这就要求按照模块化设计整个系统,各模块的功能可以相对比较独立,满足根据业务需求动态扩展新的功能模块,并且要求新增模块不能影响原来模块的使用。

1.4 自动化

自动化主要是指该ETL系统能够根据用户预定义的配置和任务单元,自动化实现对源数据的抽取、清洗、转换以及装载,要求对抽取过程中出现的异常情况自动保存现场状态,而且能对出现的异常进行实时监控。对于增量数据的抽取,要求能够根据预先定义的增量数据抽取方式自动实现增量数据抽取。

1.5 数据质量

数据质量要求考虑以下几点:第一,要求把没用的数据彻底清洗删除掉;第二,要求通过反复确认,确保真正有用的数据才能全部进入数据仓库;第三,要求尽可能减少冗余数据;第四,要求确保新的业务数据能够源源不断地及时进入数据仓库。

1.6 增量数据维护

增量数据维护是ETL系统设计的难点。增量数据抽取有多种方式,究竟应该选用哪一种方式,需要根据具体的应用情况而定。无论采取哪一种增量抽取方式,都需要重点考虑新增的业务数据能够及时、全面地进入数据仓库。

1.7 完整性约束

由于各个业务数据源系统之间的完整性约束不一致,如两个数据源系统有相同的业务内容,但是两个数据源系统可能存在不同的主外键约束,所以数据抽取到数据仓库后,要求统一数据间的完整性约束,可能需要重新定义数据的完整性约束。

1.8 性能

性能上的主要考虑系统运行效率、安全性、稳定性、健壮性等方面。要求采用多线程并发机制等先进的技术来改善性能。

2 ETL部分模块设计

2.1 元数据管理模块设计

元数据管理主要是指对“数据”和“处理规则”两方面的管理。

2.1.1 “数据”

也叫技术元数据,用于定义数据和数据之前的关系,包括元数据信息表结构和字段、数据类型等。

2.1.2 “处理规则”

也叫业务元数据,主要指定义的数据处理规则、调度规则和数据质量特征等文字信息。

元数据管理在ETL过程中是非常重要的一环,ETL过程所需要的各种规则需要通过元数据管理定义实现;ETL过程的“抽取、转换和装载作业”的调度管理也需要通过元数据管理实现。

下面是本项目元数据信息表设计样例:

字段元数据信息表

字段ID 字段

名字 字段

类型 所属

表ID 字段

长度

数据表的元数据信息表

表ID 表名称 所属数据库ID

数据库元数据信息表

数据

库ID 数据

库名 数据

URL 数据

库驱

动名 端口号 用户名 密码

数据库类别元数据信息表

数据库ID 数据库名 数据库类别

数据清洗步骤元数据信息表

清洗步骤ID 步骤

名称 清洗

算法 用户 状态

清洗算法元数据信息表

算法ID 算法

名称 算法

类别 返回

结果 算法

说明

系统用户元数据信息表

用户ID 用户名称 用户密码 用户权限

字段元数据信息表用来存储ETL过程中待清洗数据集的基本信息,比如字段编号、字段所属的基本类型、字段名字及字段所属的数据库表。因为ETL过程中接收外部数据的来源很复杂,比如在抽取前无法得知字段个数等属性,所以为方便用户执行ETL任务,特设计了字段信息表来存放待清洗集中的字段信息。以字段信息表与数据表信息表相关联,数据表信息表用于存储字段信息表所属表的信息。然后数据表信息表和数据源信息表相关联,存储该表所在数据源的详细信息。执行ETL数据抽取任务时,系统可根据这些追踪信息从数据源中抽取出源数据,形成供清洗算法使用的待清洗数据集。

数据库元数据信息表用来存储外部数据库的基本信息,如外部数据库URL,数据库用户名和密码等信息,以备数据访问组件使用。通过数据抽取接口提取出源数据供清洗系统使用。

为了有效管理这些元数据表,提高元数据信息查询的效率,系统提供一个信息检索入口,设计了目录索引表。表结构如表1、2所示。

二级目录索引表存储常被查询到的一级目录中的元数据,其中索引标识是此元数据内容显示在树型目录列表中的名称,父目录ID为 一级目录索引表中的ID。例如一级目录中清洗算法元数据内容,即各种数据清洗算法在系统中经常会被查询,建立清洗任务时,以及系统在调度清洗任务执行时都需要查询清洗算法的参数设置、调用接口等相关信息,作为二级目录存储清洗算法可以减少系统定位该算法的查询次数,提高系统的响应速度。

以上主要的元数据表之间的关联关系如图2、3所示。在数据抽取和数据载入时由于需要频繁访问和操作数据库,主要使用关联关系1,在数据清洗时由于要经常调度清洗任务和清洗算法,则更多会用到关联关系2。

2.2 缓冲区

缓冲区是为了缓和CPU和外设之间的速度差异,也就是我们经常说的I/O缓冲,这样能尽可能消除中央处理器和外设输入及输出设备之间速度不匹配问题,以能提高机器的处理效率。同时数据缓冲区可以暂存抽取的源数据和清洗完成后待加载的数据,以支持数据转换功能,而且缓冲区还支持多线程并行操作的功能,可以进一步提高ETL系统的运行效率。

缓冲区在ETL框架设计中的位置如图4所示。

在缓冲区的设计中,我们采取同时满足ETL并发操作的策略,当多个ETL任务并发执行时,有多个抽取,清洗,加载任务并发运行,因此会有多个抽取线程向缓冲区内写入数据,为避免资源冲突,我们采取多个缓冲区的策略,以支持抽取的线程并发。

我们用JAVA语言定义的缓冲区设计如下:

For(int i=0;i

ArrayList a[i]=newArrayListO;

For(intj=0;j

{

StringBuffer b[j]=new StringBufferO;//每个子缓冲支持32条记录

a[i]append(b[j]); //追加到缓冲区

}

}

在上面的代码中,我们为每个缓冲区定义了存放32条变长记录的内存空间,另外为了提高执行效率,也为满足多进程的并发机制,程序又开辟32个子缓冲区。内存开辟要求是动态分配的,所以仅会在真正启用时才会为其分配内存区域。我们可以通过以下公式粗略估计系统缓冲区的大小:

缓冲存储器=一个缓冲的大小・子缓冲个数+1K=1M

在我们这个系统中,估算lK的内存空间给每条记录是足够使用的,总共一次最多开辟1K*34*32=1M的内存空间对操作系统也是安全的,本课题的开发是基于JAVA语言,JAVA的垃圾回收机制使内存的回收有了保障,当然自己编写回收代码是更安全稳妥的做法。在具体的应用情形中,要求程序员充分兼顾内存的安全性和够用性,在具体的应用中必须确保缓冲区的安全而采用具有针对性的策略。

2.3 并发性

ETL工具重点关注数据抽取、清洗转换和加载等效率方面的问题。为了提高执行效率要求ETL工具必须具有并行执行的能力,本系统对规则的运行采用多线程机制以提供并行处理的能力。

本课题使用JAVA作为开发语言,多线程是Java语言的关键特性,多线程实现可以继承Thread类,JAVA中有两种办法来实现多线程:一是覆盖Thread类的方法run(),通过创建其子类继承并重写run(),增加实际应用中多线程的代码来实现多线程。第二是通过实现Runnable接口中仅有的run()方法,用线程代码实现run()方法来满足实际的多线程应用。本课题采用第二种方式来实现多线程。

3 小结

在本章中详细介绍了ETL原型中的几大模块的具体实现方案,在描述ETL几大模块的设计同时,还穿插描述了支撑整个ETL工程的关键技术解决方案和详细实施细节。

作者单位

太极计算机股份有限公司 北京市 100083

上一篇:科研项目管理信息系统的设计与实现 下一篇:试论云计算中数据完整性检测问题