ETL过程---留念2011年的点滴(三)

来源:互联网 发布:idc数据 研究院 编辑:程序博客网 时间:2024/05/24 06:51
 上节说了ETL工具,这节就说说ETL过程。

ETL过程,是使用ETL工具去解决实际具体的项目中的问题的一个实施过程(当然,如果不想用ETL工具,也称为ETL过程)。具体怎么实施,就不在这重复了。

这里就说一下作业如果有效的组织。

在经分系统中,多则上千个作业,少则数十个作业,对这些作业如何组织起来,实现预期的目的,是ETL实施中的一个关键性的问题。

前人的经验告诉我们,对于数量众多的东西,分而治之是行之有效的方法。方法有了,那么该如何分呢?如何治呢?

组织作业的办法:
1.按模块进行分类。   就是通常说的主题,主要是为了确保业务上的完整性。
 如财务,三户关系、产品,都可以单独分开,  定义作业编码的1-2位,表示对应模块          
 财务:10    三户关系: 11    产品: 12

2.按功能进行分类。  就是按照先后步骤,有利于数据分层。
如抽取作业、加载作业、转换作业, 定义作业编码3-4位表示对应的功能
抽取作业: 21      加载作业:  31       转换作业   41

那么我们看到作业的前四位编码是   1041  ,就可以立即知道,这是财务模块中的转换作业


把作业分类好,只是有序的工作中的第一步,接下来要考虑这些作业组织到一起的时间效率,这些作业重开始节点到结束节点,运行完,需要多少时间?3个小时、5个小时、10个小时,都有可能。我们需要控制这些时间,是我们工作进度的重要保证和有序运行。

假如有个欠费表,里面有所有的历史欠费记录,记录条数2.5亿条,导出成数据后文件大小为13个G,操作系统限制文件大小最大不能超过2G,
现在需要抽取这个表的数据,加载到新的数据仓库表中,时间控制在30分钟内 ,该如何处理呢?

1.第一个想法,配置一个单独的作业把欠费表数据直接导出,纪录一下导出时间,能在30分钟内导出就ok了。  可能你会发现,此法行不通。

2.第二个想法,配置一个单独的作业,把欠费表中当月的欠费纪录导出,纪录一下导出时间,如果在10分钟内导出完成就有可行性。

3.第三个想法,配置一个单独的作业,把欠费表中某个地市的欠费纪录导出,纪录一下导出时间,如果在3分钟内导出完成就有可行性。

 上面说的2和3,都是一个可行的方法,具体到实际情况,就是要确认欠费表,有没有分区?以哪个字段分区?  有没有建索引?在哪个字段建了索引?

假设考虑到上面的情况,我们用了5个作业并行抽取欠费表,在30分钟内完成了。就还需要为这5个作业配置相应的触发依赖关系。

到这还没有结束,还要考虑,当5个作业运行时,4个作业正确了,1个作业报错了,这个处理的方法和步骤是什么?都应该在这个时候确定好,利于后续的维护工作。

这些算完了? 没有,还有最后一步,编写相应的文档,文档内容尽量详细,每个关键点都要说清楚,不能产生歧义。首次编写肯定感觉很麻烦,要坚持,文档是一切的基础,是产出投入比很高的一个工序,当数据库拓机时,我第一个想的是组织作业的文档在什么地方,而不是数据库什么时候能启起来。

可能有人说,我现在系统中只有几十个作业,是不是就可以不采用分而治之的方法了,因为采用这个方法会增加实施的复杂度。

我的回答是,如果一个人能维护过来,你就可以不需要给自己添麻烦了。如果系统维护超过两个人,还是采取这个方法吧,不然的话,有人会骂娘的。