ETL流程说明
报表篇
1.使用场景之一:BI报表
报表是基础但很重要的使用场景,其主要作用是通过整合现有数据,提供报表作为决策的依据。
a)报表类型:(根据业务类型划分)
i.销售报表
ii.客户报表
iii.商品报表
iv.……
b)使用场景:
i.老板:我要看每个月的销售额、成单数、转化率等这些指标…(提供决策)
ii.销售组长:我要看我组员的每天的业绩情况和访问客户数…(制定销售计划)
iii.财务:我要数据组出一份销售每月的业绩提成表(减轻人工的工作量)
iv.……
由此可见,报表根据需求的来源不同,其产生的作用和带来的价值也不一样。
c)报表说明(销售报表为例)
销售报表web界面(模拟)
说明:
①查询条件:根据表中关键字段进行查询
②字段(指标):产品部提供的报表指标,每个指标都有详细的定义,例如:
1)销售金额:计算当前销售月内,跟单销售为该销售,所有成单金额-退费金额的总和
③将查询内容导出Excel表,以供进一步的计算分析
④报表内容
2.报表开发工作流程
(1)开发流程:
a)需求沟通:产品部门提供报表的核心需求(各种指标),数据团队根据现有的数据看是否能够实现
i.注意事项:
1.产品部门往往根据自己的想法制定指标,实际上业务数据可能根本不存在或者不全,所以要了解清楚每个指标的含义,是否算的出来。
2.尽量避免全量数据报表的制作,对数据库和性能消耗比较大,一般每次算一个时间周期的数据(例如一个月)
3.最好能理解产品(老板)出这份报表的用意,了解他们的实际用途,并提供数据上的建议
b)数据抽取
i.根据需求指标确定数据源
1.销售成单金额(业务数据):
a)表:销售记录明细表
b)数据库:Mysql业务库
2.销售名称、销售组(维度数据):
a)表:销售成员表、销售组部表、字典表
b)数据库:Mysql业务库
3.官网PV、UV(日志数据):
a)上报类型数据,通过埋点,然后数据采集(埋点+Flume+Nginx或ELK部分组件),最后也是落地到数据库里面
b)数据库:例如Hive
4.用户偏好(文档数据):
a)通过读取用户反馈文档,根据关键字分析用户偏好特征
b)数据源:txt文档
说明:根据需求,确定要计算的指标数据来源是在哪里,如果数据还没有落地到数据库,就需要自己去采集(或说明难度,抛给产品部门);其实一般数据都是有的,看下一步:
ii.将数据加载到数据仓库中(方便做复杂逻辑处理)
1.一般重要且常用的数据每天都会通过定时调度流程抽取到Hive数仓(Oozie&crontab&Azkaban+sqoop)
2.数仓分层:
a)源数据层(上述各个数据源的数据定时加载到数仓中,数据结构表字段等和源数据一致。一般凌晨后执行加载程序,加载昨天的数据)
b)基础层:根据业务主题设计不同的表,例如销售记录明细表,客户信息详情表等
i.特点:在源数据的基础上按主题划分,例如销售相关的源数据层表为一个主题,这个主题之间的表根据业务需要做一些基础的关联,获取明细表、历史记录表等
ii.此类表往往可以反复被使用,适用于不同报表开发的数据来源
c)汇总层(集市层)
i.特点:根据业务场景预抽取、预汇总和预加工的表
ii.此类表一般根据业务场景预先提炼一些共性的数据,方便后续报表开发的时候
d)应用层
i.特点:直接对接需求的表,一般复用性比较差,已经定制好了
说明:这一部分需要开发的内容如下:
1、数据抽取程序/脚本(数据导入到数仓)
1)实际产出:Sqoop脚本/shell脚本/python脚本等
2、源数据处理程序/脚本(写根据hive源表,获得相关明细表)
1)实际产出:转换脚本(写SQL语句,UDF自定义函数)
3、数据汇总程序/脚本(数据从基础层汇总到集市层)
1)实际产出:汇总程序/脚本(写Sql)
4、应用层程序/脚本(数据从集市层根据实际业务需求制定报表指标)
1)实际产出:应用层程序/脚本(写Sql)
5、数据导出(数据从hive导出到关系型数据库)
1)实际产出:导出程序/脚本
最后:通过不懈努力,我们得到了5个程序或脚本文件,然后通过工作调度就可以完成数据抽取、处理、转化、存储部分内容了(注意:数据采集在此流程之前,此处不展开)
注意:ETL可以用很多方式/工具完成,上述的方式是通过脚本(shell、perl、python等)或编写Java程序完成数据处理工作,除此之外还有很多ETL组件和工具可以使用,例如kettle,但是无论是工具还是脚本,都是要写Sql的。
Kettle(Spoon简图)
说明:Kettle是专门做ETL的工具,操作方式比较简便,通过图形界面的图标拖拽可以完成一系列的骚操作,里面有很多做好了的插件可以使用,也有自带的调度工具。
3.关于调度(调度工具:公司自己基于crontab开发的一套,不具备代表性)
ETL任务调度注意事项:
(1)注意任务流程顺序,不要形成回路/循环:
1)例如:A->B->C->A(此举对于某些调度工具,可能导致异常或不断提交任务,导致服务器资源耗尽而瘫痪)
(2)后者程序的输出数据依赖前者数据的输出(这个都懂的)
(3)没有依赖关系的流程,为了提高执行效率可以并行执行(这个需要在执行时间和集群性能之间进行衡量,不过也可以给调度工具分配好资源)
(4)数据上的依赖:注意本次流程依赖的数据,例如流程H依赖的表有A、B、C、D表,ABC表每晚一点加载到hive,D表是另外一张报表的数据输出,每晚两点半执行。因此,为了数据的准确性,流程H的调度依赖D报表,执行在D报表输出流程的后面。
(5)调度流程的频率,根据业务的需要而不同(分时日月周年)
(1)每天:一般完成凌晨后执行(每天晚上算昨天/上个月的数据)
(2)每周:每周一定时发邮件
(3)每小时:每隔两个小时执行一次(对数据的时效性要求比较高的流程,但还是离线处理)
说明:任务调度的操作一般通过UI界面实现,可参考所学习的Azkaban
4.报表平台(可视化界面)
数据已经导出到数据库了,接下来就是报表数据的展示,我工作的时候使用的是公司自己搭的数据平台,通过界面配置(编写Sql语句)就可以直接读取数据库的报表数据,前端页面进行展示(此过程对应SSM+Echarts
5.总结
(1)BI报表的开发主要工作量在于对业务数据的了解,知道哪些数据在哪些表,哪些指标用了哪些数据,这些指标怎么算才准;
(2)其次是Hive Sql的编写,初期Hive Sql对优化要求不高(先按需求写出来,后期根据需要优化,但是面试肯定要说你会Sql优化,优化前后执行时间长短,优化前后CPU/内存等指标变化等)
(3)数据准确性,数据准确性是必须的,要仔细思考自己的逻辑是否正确
(4)数据抽取、转化、汇总这几个流程,实际上是将不同数据源的数据汇聚在一个仓库中,再按照不同粒度和业务将数据进行划分,得到最小粒度(时间粒度、部门粒度、业务粒度等)下的不同业务的数据,然后你就可以根据业务需求汇总你需要的粒度数据,形成报表。
面试(开发中的一些问题总结):
一、数据埋点上报
1.数据加密
2.数据压缩
3.埋点策略
4.数据丢失
二、数据抽取
1.数据同步策略(增量策略)
2.数仓建模(根据主题分层,业务相关)
三、脚本开发
1.对平台资源的把控(严格规范hsql开发)
2.开发规范:程序开发,异常告警,平台监控
3.能增量计算尽量不全量
4.支持失败后重跑
四、操作系统
1、清楚程序提交后的运行位置(jvm,线程,进程)
2、linux常规操作(查看cpu,内存使用情况,异常进程发现与杀死,僵尸进程,内存溢出等)
3、脚本开发(shell等)
五、任务调度工具
1、熟悉一种etl任务调度工具(kettle,ariflow,oozie等)
六、平台管理
1、cdh节点资源再平衡(加机器)
2、各种ui界面的功能及使用
3、性能瓶颈时的调优(内存不足,机器资源不够时怎么办?控制内存使用上界,数据落地到磁盘)
七、sql
1.hive sql(开窗函数,行转列,列转行,自定义函数)
2.mysql(变量的使用)
八、mysql
1.主从同步原理(同步失败怎么办)
2.表数据量太大怎么办,分库分表,横向纵向分表使用场景,分区,视图
3.优化:索引失效怎么办,如何监控慢sql,如何建索引
|
|