系统设计与架构笔记:ETL工具开发和设计的建议
最近项目组里想做一个ETL数据抽取工具,这是一个研发项目,但是感觉公司并不是特别重视,不重视不是代表它不重要,而是可能不会对这个项目要求太高,能满足我们公司的小需求就行,想从这个项目里衍生出更多的东西估计难。昨天领导让我写写自己的见解,今天写了点,不过说见解还真不敢,所以取了个名字叫建议了,今天把这个文档贴到自己博客里和大伙分享分享。
贴文档之前,我想很多朋友估计并不熟悉ETL,如果接粗过数据挖掘一定对ETL很熟悉了,ETL是数据挖掘里非常重要的一环,具体什么是ETL,大家看下面这段文字:
ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)作为BI/DW(Business Intelligence)的核心和灵魂,能够按照统一的规则集成并提高数据的价值,是负责完成数据从数据源向目标数据仓库转化的过程,是实施数据仓库的重要步骤。如果说数据仓库的模型设计是一座大厦的设计蓝图,数据是砖瓦的话,那么ETL就是建设大厦的过程。在整个项目中最难部分是用户需求分析和模型设计,而ETL规则设计和实施则是工作量最大的,约占整个项目的60%~80%,这是国内外从众多实践中得到的普遍共识。
ETL是数据抽取(EXTRACT)、转换(TRANSFORM)、清洗(CLEANSING)、装载(LOAD)的过程。是构建 数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去。
我们所要做的ETL工具不是针对数据仓库,说白了就是要个安全稳定的数据库数据导出导入工具。下面就是我写的文档,希望童鞋们看了后请多多指教。
1.1. 概述
如图1-1:
ETL工具共分为三大模块:ETL核心模块、日志模块和WEB模块。
1.1.1. ETL核心模块
ETL核心模块是整个ETL工具的核心,它主要的功能是根据事先定义好的规则将源数据库的数据抽取到目标数据库。其主要工作流程是:
数据抽取-->数据转换-->数据清洗-->数据加载
ETL工具里的配置数据库必须包含两个方面的数据:
- 元数据:元数据主要是指源数据、目标数据库以及可以用于抽取的表、字段等等信息,还有一些相关函数的定义等等。
- ETL任务信息:ETL任务在我们ETL工具里称作job,job是指一个将数据从源数据库导出,并且按照一定规则导入到目标数据库的过程,ETL任务信息就是指一个job的相关配置信息。
1.1.2. 日志模块
良好的系统最重要的特征之一就是它的差错、容错以及能正确提供系统运行信息的特性。所以日志模块是每个系统必不可少的部分,它设计的优劣直接关系到系统后期维护的成本。
ETL工具里的日志模块,我个人认为应该包含如下的部分:
- 程序运行信息。这个主要是用log4j在代码里记录。
- ETL任务(即job)运行失败的日志信息。一切因为程序所抛出的异常所引起的失败都要记录在log4j的运行日志里,如果能精确提炼出的常见异常,最好能记录在数据库的日志表,便于快速查找错误信息(这个在有WEB系统时候可以做)。
- 审计日志。审计日志是带有一定业务需求的日志,这个是否要记录看实际的需求。
- 错误告警。一般而言ETL抽取数据的操作都是一件漫长的事情,ETL开发人员不可能长时间坚守在系统旁边,所以当系统运行出错能在第一时间通知到相关负责人是很有必要。Log4j里有邮件通知的功能,用起来也不太难,可以考虑在日志模块加入告警的功能。
1.1.3. WEB模块
当我们开发好了ETL工具后我们需要一个入口,告诉我们设计的ETL工具你具体做什么样的任务。WEB模块的作用就是给用户操作的入口,我个人认为WEB模块包含以下功能:
- 元数据管理:主要是向配置数据库定义源数据库和目标数据库的相关信息,例如:数据库的url,用户名,密码,相关的表以及表里字段信息等等。这些信息很重要,如果没有这些信息,整个ETL作业就是无源之水,根本无法进行。
- ETL任务的配置信息:即job的配置信息,这个就是定义我们ETL的抽取过程,例如ETL需要抽取的源数据库是那个,抽取那张表那些字段,按照什么规则转化数据,清洗数据,最终导入到那个目标数据库等等。
- 查看日志信息:这个功能可选,查看日志信息主要是提高系统的友好程度,便利系统运行信息的查看。
- 用户管理:这个功能暂时可选,因为我们所开发的ETL工具主要是内部使用,没有太大必要做复杂的权限管理,但是简单的用户信息管理做做应该还是必要的。
整个WEB模块也是可选的,如果人力和时间不够是没必要做一个web系统,ETL入口我们可以手动的配置任务信息。(假如真的做了WEB模块,对ETL后台的设计和开发要求也会更高)。
1.2. 关于技术开发的一点建议
我之前看过大家写的ETL需求文档,大家考虑的非常全面,这里我暂时有两个技术建议, 建议如下:
1.2.1. Xml技术
Xml技术在企业级系统开发和互联网开发中使用十分广泛,xml使用的场景也是非常的多,其中一个特点非常适合我们在ETL工具开发中使用到,那就是它可以存储复杂的富有变化的数据结构。而我们定义ETL任务信息(job配置信息)就是一个复杂的富有变化的数据。大家看下面的例子:

<?xml version="1.0" encoding="UTF-8"?>
<Job>
<Id>流水号</Id>
<Extract>
<JDBCSource>
<Url>…</Url>
<Username>…</UserName>
<Password>…</Password>
</JDBCSource>
<JDNISource>…</JNDISource>
<Table>…</Table>
<Columns>
<Column>…</Column>
<Column>…</Column>
…
</Columns>
<Where>…</Where>
<Commit>…</Commit>
<OrderBy>…</OrderBy>
<FilePath></FilePath>
</Extract>
<Transform>
<Columns>
<Column>
<SrcColumn> <!-- 抽取的原字段-->
</SrcColumn>
<Methods>
<Method id="1"> <!-- 第一次转换-->
<Function>...</Function>
</Method>
<Method id="2"> <!-- 第二次转换-->
<Function>...</Function>
</Method>
</Methods>
<DesColumn> <!-- 加载的目标字段-->
</DesColumn>
</Column>
<Column>...</Column>
</Columns>
<SouceFilePath>...</SourceFilePath>
<TargetFilePath>...</TargetFilePath>
<Commit>...</Commit> <!--每一批次的处理条数 -->
</Transform> <Load> <JDBCSource> <Url>…</Url> <Username>…</UserName> <Password>…</Password> </JDBCSource> <JDNISource>…</JNDISource> <Table>…</Table> <Columns> <Column>…</Column> <Column>…</Column> … </Columns> <Commit>…</Commit> <LoadFilePath></LoadFilePath> </Load></Job>

这是一个job配置信息demo,如果我们把这些数据用数据库来存储解析起来一定是非常复杂,数据库的表结构不适合表现出程序里复杂的数据结构。
在这里我们不应该把XML当做配置文件看待,而是当做一种数据存储的介质,其作用主要是便于我们读写数据。
既然对xml有读写操作,因此使用digester解析xml的技术远远不够,这里我建议使用xmlbeans,xmlbeans对于读写xml更加的简便,关于xmlbeans的学习参考如下:
Xmlbeans的使用:
http://blog.163.com/pqg_iloveyou/blog/static/33351875200761811255619/
xsd的学习资料:
http://www.w3school.com.cn/schema/schema_example.asp
xmlbeans官网:
xsd在eclipse开发起来十分的简便。
使用xmlbeans维护xml的成本也会比较低。
1.2.2. Spring Batch技术
对于spring batch技术我现在还不是特别熟悉,到底能不能被我们使用还需要考察和研究,但现在我知道的它的几个特点很符合我们ETL工具开发的场景:
- spring batch批量处理框架,我们的抽取数据的过程就是一个批量的过程,因此spring batch是适合我们现在应用的场景。
- 我们抽取的数据先是存储在临时文件,现在规定的临时文件的格式是csv,而spring batch正好有批量操作csv文件的功能,这个也很符合我们应用的场景。
1.3. 总结
因为本人以前做过和ETL工具类似的项目,因此这里大胆的提出一点自己的建议,仅供参考。
不过我在概述里画的系统结构图希望大家可以好好看看,也许还有很多不合理的地方,这需要大家集体智慧进行改进,我个人觉得系统的整体架构设计十分重要,我在看需求分析时候虽然感觉大家写的很全面,但是很难对系统整体结构有一个清晰认识,究其原因是需求里缺乏对系统的整体架构设计的部分,我个人觉得系统整体设计很重要很有必要,整体架构设计会给我们带来很多好处:
- 整体架构设计会给我们需要做哪些功能有一个清晰的认识,这个认识会避免开发的时候遗漏了功能。
- 整体架构能清晰表现出各个功能模块的关系,做过开发的人应该都会有这样的体会,模块之间的交互的地方很容易产生问题,而且交互产生的问题也是很难查找定位的,整体架构设计会让我们清晰认识到模块交互关系,利于我们做模块之间交互的开发。
- 整体架构能清晰体现出模块之间的边界在哪里,这个很重要,不清晰模块之间的边界,很容易在把A模块的功能写到了B模块中,最终导致系统的不稳定。
- 整体架构的设计能给项目开发的分工做参考,更合理的安排工作,提高生产效率。
系统设计与架构笔记:ETL工具开发和设计的建议的更多相关文章
- 基于两种架构的ETL实现及ETL工具选型策略
企业信息化建设过程中,业务系统各自为政.相互独立造成的"数据孤岛"现象尤为普遍,业务不集成.流程不互通.数据不共享--.这给企业进行数据的分析利用.报表开发等带来了巨大困难.在此情 ...
- golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好
golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好 jetbrain家的全套ide都很好用,一定要dark背景风格才装B 从File-->s ...
- 客户视角:Oracle ETL工具ODI
客户视角:Oracle ETL工具ODI 数据集成已成为企业在追求市场份额中的关键技术组件,与依靠手工编码的方式不同,越来越多的企业选择完整的数据集成解决方案来支持其IT战略,从大数据分析到云平台的集 ...
- 三大主流ETL工具选型
ETL(extract, transform and load)产品乍看起来似乎并不起眼,单就此项技术本身而言,几乎也没什么特别深奥之处,但是在实际项目中,却常常在这个环节耗费太多的人力,而在后续的维 ...
- 开源ETL工具之Kettle介绍
What 起源 Kettle是一个Java编写的ETL工具,主作者是Matt Casters,2003年就开始了这个项目,最新稳定版为7.1. 2005年12月,Kettle从2.1版本开始进入了开源 ...
- 【转】ETL介绍与ETL工具比较
本文转载自:http://blog.csdn.net/u013412535/article/details/43462537 ETL,是英文 Extract-Transform-Load 的缩写,用来 ...
- ETL工具总结
ETL的考虑 做 数据仓库系统,ETL是关键的一环.说大了,ETL是数据整合解决方案,说小了,就是倒数据的工具.回忆一下工作这么些年来,处理数据迁移.转换的工作倒 还真的不少.但是那些工 ...
- 几款开源的ETL工具及ELT初探
ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.ETL 是构建数据仓 ...
- 大数据之ETL工具Kettle的--1功能介绍
Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行. 说白了就是,很有必要去理解一般ETL工具必备的特性和功能,这样才更好的掌握Kettle的使用. ...
随机推荐
- 学习笔记TF064:TensorFlow Kubernetes
AlphaGo,每个实验1000个节点,每个节点4个GPU,4000 GPU.Siri,每个实验2个节点,8个GPU.AI研究,依赖海量数据计算,离性能计算资源.更大集群运行模型,把周级训练时间缩短到 ...
- Oracle使用外部表批量创建用户
整体思路:通过使用外部表将用户名导入Oracle的表中,然后通过PL/SQL遍历数据表,批量创建用户. 具体步骤如下: 1.在安装数据库的服务器的C盘根目录创建一个User List.txt文件,内容 ...
- POJ1037 A decorative fence
题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...
- maven多模块项目构建
描述 一个大的企业级项目通常跨越了数十万行代码,牵涉了数十或数百软件人员的努力.如果开发者在同一个项目下开 发,那么项目的管理.构建将会变得很难控制.因此设计人员会将项目划分为多个模块,多个模块独 ...
- HI3518EV200+AR0130开发板烧录uboot、kernel、rootfs及其参数配置
分区名 分区大小 起始地址 截至地址bootloader:1M 0x00000000 0x00100000kernel: 3M 0x00100000 0x00400000rootfs: 12M 0x0 ...
- redis 批量删除 keys
#!/bin/bash redis_list=("192.168.252.174:7000" "192.168.252.174:7001" "192. ...
- 剑指offer 4.树 重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 简简单单美化你Mac os x的终端配色
Mac OS x虽然是以图形界面出名的,但是作为一个类Unix系统,还是离不开终端(shell)的,尤其是对于开发人员来说,Mac OS x默认状态的终端给人的感觉总是不那么舒服,所以很有必要对它进行 ...
- ubuntu设置 SSH 通过密钥对登录
1. 制作密钥对 首先在服务器上制作密钥对.登录到打算使用密钥登录的账户,然后执行以下命令: [root@host ~]$ ssh-keygen <== 建立密钥对 Generating pub ...
- 虚拟机中的linux系统文件突然全部变成只读的问题
当宿主系统和虚拟机的IO都比较繁忙时,虚拟机的IO请求得不到及时的响应.虚拟机Linux不知道自己运行在虚拟机里面,会认为是磁盘IO错误,为了保护磁盘数据会remount分区为只读. 这时候如果只是对 ...