PB级企业电商离线数仓项目实战【上】- 笔记
第一部分 数据仓库理论
数据仓库四大特征
面向主题的: 抽象的,逻辑的
集成的:为分析服务
稳定的: 很少更新,只需定期加载
反映历史变化的: 按照时间顺序追加
与数据库区别
OLTP(On-Line Transaction Processing 联机事务处理),也称面向交易的处理系统。主要针对具体业务在数据库系统的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理。数据库
OLAP(On-Line Analytical Processing 联机分析处理),一般针对某些主题的历史数据进行分析,支持管理决策。数据仓库
数据仓库在设计是有意引入数据冗余(目的是为了提高查询的效率),采用反范式的方式来设计;数据库设计是尽量避免冗余(第三范式),一般采用符合范式的规则来设计
数据集市
数据仓库(DW)是一种反映主题的全局性数据组织。但全局性数据仓库往往太大,在实际应用中将它们按部门或业务分别建立反映各个子主题的局部性数据组织,即数据集市(Data Mart),有时也称它为部门数据仓库。数据集市:是按照主题域组织的数据集合,用于支持部门级的数据分析与决策。
数据仓库建模方法
ER模型
在范式理论上符合3NF,它是站在企业角度面向主题的抽象, 对建模人员要求较高。
维度模型
从分析决策的需求出发构建模型
- 选择需要进行分析决策的业务过程。
- 选择数据的粒度(关心的层面)。在事件分析中,我们要预判所有分析需要细分的程度,从而决定选择的粒度
- 识别维表(地域,时间)。选择好粒度之后,就需要基于此粒度设计维表,包括维度属性,用于分析时进行分组和筛选
- 选择事实。确定分析需要衡量的指标
数据仓库分层
数据仓库模型
事实表,维度表
保存度量值的详细值或事实的表称为事实表。事实表根据数据的粒度可以分为:事务事实表、周期快照事实表、累计快照事实表。特点:表多,数据量大。关注内容
维度表(维表)可以看作是用来分析数据的角度,纬度表中包含事实数据表中事实记录的特性。有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息。管擦好的角度
星型模型,雪花模型
星型模是一种多维的数据关系,它由一个事实表和一组维表组成;事实表在中心,周围围绕地连接着维表;
事实表中包含了大量数据,没有数据冗余;
维表是逆规范化的,包含一定的数据冗余;比如省市,季度,月
雪花模式是星型模型的变种,维表是规范化的,模型类似雪花的形状;
特点:雪花型结构去除了数据冗余。
数据仓库由多个主题构成,包含多个事实表,而维表是公共的,可以共享,这种模式可以看做星型模式的汇集,因而称作星系模式或者事实星座模式。
特点:公用维表
元数据
元数据(Metadata)是关于数据的数据。元数据打通了源数据、数据仓库、数据应用,记录了数据从产生到消费的全过程
业内通常把元数据分为以下类型:
技术元数据:库表结构、数据模型、ETL程序、SQL程序等
业务元数据:业务指标、业务代码、业务术语等
管理元数据:数据所有者、数据质量、数据安全等
电商离线数仓设计
系统逻辑架构:
会员活跃度
指标口径业务逻辑:
会员:以设备为判断标准,每个独立设备认为是一个会员。Android系统通常根据IMEI号,IOS系统通常根OpenUDID 来标识一个独立会员,每部移动设备是一个会员;
活跃会员:打开应用的会员即为活跃会员,暂不考虑用户的实际使用情况。一台设备每天多次打开计算为一个活跃会员。在自然周内启动过应用的会员为周活跃会员,同理还有月活跃会员;
会员活跃率:一天内活跃会员数与总会员数的比率是日活跃率;还有周活跃率(自然周)、月活跃率(自然月);
新增会员:第一次使用应用的用户,定义为新增会员;卸载再次安装的设备,不会被算作一次新增。新增用户包括日新增会员、周(自然周)新增会员、月(自然月)新增会员;
留存会员与留存率:某段时间的新增会员,经过一段时间后,仍继续使用应用认为是留存会员;这部分会员占当时新增会员的比例为留存率。
数据采集
使用flume,自定义拦截器,获取header,body,主要将time时间戳转换为日期格式,后放入header中
自定义拦截器的实现:
1、获取 event 的 header
2、获取 event 的 body
3、解析body获取json串
4、解析json串获取时间戳
5、将时间戳转换为字符串 “yyyy-MM-dd”
6、将转换后的字符串放置header中
7、返回event
在flume.conf中定义自己的拦截器
a1.sources.r1.interceptors.i1.type =
cn.lagou.dw.flume.interceptor.CustomerInterceptor$Builder
启动测试:
flume-ng agent --conf /opt/apps/flume-1.9/conf --conf-file
/data/lagoudw/conf/flume-log2hdfs2.conf -name a1 -
Dflume.root.logger=INFO,console
小结:
- 使用taildir source 监控指定的多个目录,可以给不同目录的日志加上不同header
- 在每个目录中可以使用正则匹配多个文件
- 使用自定义拦截器,主要功能是从json串中获取时间戳,加到event的header中
- hdfs sink使用event header中的信息写数据(控制写文件的位置)
- hdfs文件的滚动方式(基于文件大小、基于event数量、基于时间)
- 调节flume jvm内存的分配
ODS
主要关联hdfs上的日志目录。
script/member_active/ods_load_log.sh
json数据处理
内建函数
get_json_object(string json_string, string path)
返回值:String
json_tuple(jsonStr, k1, k2, …)
返回值:所有的输入参数、输出参数都是String;
explode,使用explod将Hive一行中复杂的 array 或 map 结构拆分成多行。
-- get 单层值
select username, age, sex, get_json_object(json, "$.id") id,
get_json_object(json, "$.ids") ids,
get_json_object(json, "$.total_number") num
from jsont1;
-- get 数组
select username, age, sex, get_json_object(json, "$.id") id,
get_json_object(json, "$.ids[0]") ids0,
from jsont1;
-- 使用 json_tuple 一次处理多个字段
select json_tuple(json, 'id', 'ids', 'total_number')
from jsont1;
也可以使用UDF
cn.lagou.dw.hive.udf.ParseJsonArray
select username, age, sex, ids1, id, num
from jsont1
lateral view explode(lagou_json_array(json, "ids")) t1 as ids1
lateral view json_tuple(json, 'id', 'total_number') t1 as id,
num;
各种Json格式处理方法小结:
1、简单格式的json数据,使用get_json_object、json_tuple处理
2、对于嵌套数据类型,可以使用UDF
3、纯json串可使用JsonSerDe处理更简单
DWD
script/member_active/dwd_load_start.sh, 完成json解析
日志文件 =》 Flume =》 HDFS =》 ODS =》 DWD
ODS =》 DWD;json数据的解析;数据清洗
DWS
1、建表(每日、每周、每月活跃会员信息)
2、每日启动明细 ===> 每日活跃会员
3、每日活跃会员 => 每周活跃会员;每日活跃会员 => 每月活跃会员
script/member_active/dws_load_member_start.sh
4、汇总生成ADS层的数据
ODS => DWD => DWS(每日、每周、每月活跃会员的汇总表)
ADS
script/member_active/ads_load_member_active.sh
总结
脚本顺序:
ods_load_startlog.sh
dwd_load_startlog.sh
dws_load_member_start.sh
ads_load_member_active.sh
新增会员总结
脚本顺序:
dws_load_member_add_day.sh
ads_load_member_add.sh
留存会员总结
脚本顺序:
# 加载ODS / DWD 层采集
ods_load_startlog.sh
dwd_load_startlog.sh
# 活跃会员
dws_load_member_start.sh
ads_load_member_active.sh
# 新增会员
dws_load_member_add_day.sh
ads_load_member_add.sh
# 会员留存
dws_load_member_retention_day.sh
ads_load_member_retention.sh
DataX
DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。
Reader:数据采集模块,负责采集数据源的数据,将数据发送给Framework;
Writer: 数据写入模块,负责不断向Framework取数据,并将数据写入到目的端;
Framework:用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。
Task便是DataX作业的最小单元,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作。
Tez
Tez是Apache开源的支持DAG(有向无环图)作业的计算框架,是支持Hadoop 2.x的重要引擎。它源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分,分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的DAG作业。
Tez可以将多个有依赖的作业转换为一个作业(只需写一次HDFS,中间环节较少),从而大大提升DAG作业的性能。