说到ETL,很多开发伙伴可能会有些陌生,我也是在近几年的工作过程中才接触到ETL的,现在的项目是比较依赖于ETL,可以说是项目中重要的一部分。
先看一看ETL是做什么用的:ETL是将各个业务系统的数据,通过抽取、清洗、转换之后,加载到数据仓库的过程;ETL可以将分散、零乱、标准不统一的数据整合到一起。完整的ETL功能有很多(ETL是三个三次的缩写...),我只从我实际使用的场景出发,说明我对ETL的理解和实际应用。
我接触过的项目,使用ETL工具的场景有这个几种:
报表、BI系统:在公司建设的初期,业务比较少,系统也比较少,一台数据库就搞定了;
随着公司业务的增加,业务系统被拆成很多系统;
随着数据量的继续增加,单个系统的数据增加到一定程度的时候,也做了分库分表;
这时候领导、业务人员在用数据做分析的时候,数据来源可能是多个系统的多张表,这时候企图通过一个复杂的SQL跑出来结果就很困难了;通常公司会建立一个数据仓库,通过ETL工具把数据抽取到数据仓库中,再做数据的拟合和展示。
跨系统的数据加工或查询:我们现在所在公司,业务系统有几百个,由于业务流程比较复杂,前端系统在做业务操作的时候,在正式提交交易之前,有很多业务校验;比如要查询客户在A系统的交易历史,在B系统的交易历史,在C系统的交易历史;那么就需要分别调用A、B、C系统的接口,这个对前端系统很不友好,那么通常的解决方案是什么?
学阿里,建中台,、把A/B/C系统合并成一个大中台,对外提供服务;这种方法很好,但是非常难;很多公司,别说把A/B/C合成一个系统了,就是A系统本身的重构,都非常地困难;
第二种方案,在前段系统和A/B/C系统之间,增加一层,可以叫做服务中台,它的作用是整合A/B/C系统的服务,然后对外提供一个服务给前端系统调用;好处是前端系统只需要调用服务中台的一个接口即可;
我们现在采用的是第三个方案,把A/B/C系统的数据,通过ETL抽取到一起,并通过Java把数据提前加工好,保存到MongoDB中的同一个Collection中(利用了MongoDB数据结构的特点);再对外提供服务的时候,相当于做了一次单表查询,就可以查询到三个系统的数据;好处是可以调一个接口查出三个系统的数据,并且缓解了三个系统的查询压力;
当然这个方案也有着一个很大的缺陷,就是有一定的延迟,需要根据业务场景进行评估,是否接受这个延迟。
ETL的工具也有不少,我们现在使用的是Informatica,这是收费的,开源的只接触过Kettle;
我们现在是根据数据表的时间戳,做增量抽取,在我看来,比较理想的方案是业务系统可以把数据“吐出来”,比如业务系统埋点发送MQ、MySQL可以监听binlog日志,不过在我们公司都非常难以实现;
所以,至少在我们项目,ETL是很难被替换掉的。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有