项目介绍
项目整体介绍
1.项目模型搭建
此项目为数据仓库项目,主要是做离线计算的
项目模型:项目分为流量域和业务域两个主题域,为了方便管理这么多数据,又将每个主题域划分为五个层级,分别是ODS层,DWD层,DWS层,ADS层及DIM层,分层的原因为解耦,复用,便于管理,下面我分别介绍一下项目中他们的应用场景
1.1 ODS层
ODS层:源数据层,分为流量域ODS层及业务域ODS层
流量域ODS层:数据来源于日志服务器(用户行为日志数据(APP端和WEB端)),日志服务器将数据生产到Kafka,然后使用Flume日志采集工具消费Kafka中的数据并将数据采集到Hdfs集群,在Hive中将数据加载到ODS层的Hive表中,这样就完成了原始数据的采集
业务域ODS层:数据来源于业务系统中的关系型数据库mysql,采用sqoop抽取工具将数据从mysql导入到Hdfs中,再在Hive中将数据加载到ODS层相应的表中
1.2 DWD层
DWD层:数据明细层,同样分为流量域DWD层及业务域DWD层
流量域DWD层:将数据在ODS层进行ETL操作(先对ODS层数据进行清洗,过滤(过滤掉缺失重要字段信息,重要字段信息为空或者json格式不正确的数据),降维等操作),再抽取到DWD层
业务域DWD层:抽取ODS层每天的增量数据,与DWD层每天的全量数据进行合并,得到DWD层当天的全量数据并写到DWD层,如:订单明细表,购物车明细表,优惠券明细表,红包明细表等
1.3 DWS层
DWS层:轻度聚合层,为ADS报表服务层提供便利做的聚合表
流量域DWS层:如流量主题概况表,用户分布分析主题表,新用户留存表,用户活跃度主题表,交互事件主题表,站外投放主题表,站内运营主题表,优惠券主题表,红包主题表等
业务域DWS层:订单金额主题表,订单数量,人数主题表,营销活动主题表,优惠券使用主题表等
1.4 ADS层
ADS层:应用服务层(报表层)
根据实际需求在DWS层的基础上进行各种分组,聚合即可得到报表
1.5 DIM层
DIM层:维表层,存放的都是一些维度信息相关的表格,如地理位置维度表等
2.项目技术选型
项目技术选型为:
基础设施:hive
数据存储平台:hdfs
资源调度及监控平台:yarn
运算引擎:spark
日志采集工具:flume
任务调度工具:azkaban
元数据管理系统:atlas
3. 项目重难点
3.1 拉链表的实现
此项目设计了订单拉链表,用户拉链表等,此处以订单拉链表举例,订单拉链表设计的初衷是为了可以在一张表中查看到一个订单每天的状态信息,设计成拉链表既可以实现此功能,又可以节省很多存储空间,具体的实现逻辑如下:
将ods层每天的增量数据与前一天的拉链表进行整合,整合时分为以下三种情况:老订单老区间,老订单新区间和新订单新区间,老订单老区间的结束时间不变,依然是9999-12-31,老订单新区间的结束时间发生改变,从原本的9999-12-31变为当天的时间,同时此订单新开一个区间,区间开始的时间为当天,结束的时间为9999-12-31,新订单新区间的开始时间为当天,结束时间为9999-12-31
3.2 设备id绑定
设计这种设备id与账号动态绑定的背景:是由于把在一个设备id上登录的账号当作一个用户的唯一标识在实际中很多时候不太准确,例如一个设备第一次被A登录,以后的登录行为都是B,但每次B登录时系统都以为是A进行的登录,会大大降低数据的可靠性,并且这种情况有可能经常发生,为了解决这个问题,想出了这个解决方案,具体实现思想如下:
加载T日的日志数据,按照设备id及账号进行组合,对账号id进行去重,只取时间最早的一条,在同一个设备上,对不同的登录账号打分,登录时间越早,得分越高(按照设备id进行分组,取账号及时间字段),加载T-1日绑定表,将两张表按照设备id进行join,计算出每个设备登录过的每个账号的最终得分,得分最高的账号作为设备绑定的guid(唯一用户标识),并将最终数据保存为T日的设备绑定表,在将ODS层数据进行ETL处理的过程中,需要给每个设备id增加一个唯一的guid,加载T日的设备绑定表,然后进行处理,即可完成绑定
来源:oschina
链接:https://my.oschina.net/u/4365833/blog/4513761