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个作业报错了,这个处理的方法和步骤是什么?都应该在这个时候确定好,利于后续的维护工作。
这些算完了? 没有,还有最后一步,编写相应的文档,文档内容尽量详细,每个关键点都要说清楚,不能产生歧义。首次编写肯定感觉很麻烦,要坚持,文档是一切的基础,是产出投入比很高的一个工序,当数据库拓机时,我第一个想的是组织作业的文档在什么地方,而不是数据库什么时候能启起来。
可能有人说,我现在系统中只有几十个作业,是不是就可以不采用分而治之的方法了,因为采用这个方法会增加实施的复杂度。
我的回答是,如果一个人能维护过来,你就可以不需要给自己添麻烦了。如果系统维护超过两个人,还是采取这个方法吧,不然的话,有人会骂娘的。