电商数仓
作者:互联网
1 数据仓库的概念
数据仓库(Data Warehouse )可简写为DW或DWH。数据仓库是为企业所有决策制定过程,提供所有系统数据支持的战略集合。
通过对数据仓库中数据的分析,可以帮助企业改进业务流程、挖制成本、提高产品质量等。
数据仓库并不是数据的最终目的她,而是为数据最终的目的她做好准备。这些准备包括对数据的清洗、转义、分类、重组、合并、拆分、统计等等。
2 项目需求
1、实时采集埋点的用户行为数据
2、实现数据仓库的分层搭建
3、每天定时导入业务数据
4、根据数据仓库中的数据进行报表分析
电商中最关心的指标:留转GMV复活
留:用户留存——留存用户数、留存用户比率表
转:转化率——新增用户占日活跃用户比率表、用户行为漏斗分析表
GMV:GMV成交总额——每日成交总额表
复:品牌复购率——品牌复购率表
活:用户活跃——活跃设备数表
3 用户行为数据采集
3.1 数据生成模块
用户行为的数据来源于web或app前端的埋点、日志服务器。如果是开发阶段,没有实际生产数据,可以自己开发并利用数据生成脚本生成模拟数据。数据例子如下:
{
//ap和cm是公共字段,即每个json文件都有的字段
"ap": "weather", //产品字段
"cm": { //安卓手机都包含的字段
"ln": "-89.2", // (double) lng经度
"la": "-27.4", // (double) lat 纬度
"sv": "V2.0.4", // (String) sdkVersion
"os": "8.2.0", // (String) Android系统版本
"g": "M67B4QYU@gmail.com", // (String) gmail
"nw": "4G", // (String) 网络模式
"l": "en", // (String) 系统语言
"vc": "18", // (String) versionCode,程序版本号
"hw": "1080*1920", // (String) heightXwidth,屏幕宽高
"ar": "MX", // (String) 区域
"uid":"u8678", //(String) 用户标识
"t": "1549679122062", // (String) 客户端日志产生时的时间
"md": "sumsung-12", // (String) 手机型号
"vn": "1.1.3", // (String) versionName,程序版本名
"ba": "Sumsung", // (String) 手机品牌
"sr": "Y" // (String) 渠道号,应用从哪个渠道来的
},
//业务字段,不同的业务对应的json文件中,et里面的字段不同
"et": [ //事件:业务字段,即埋点上报的字段,有具体的业务类型
]
}
日志分两类,启动日志和事件日志。
启动日志的部分数据如下。
"et": [
{
"ett": "1550707565779",
"en": "start", //启动
"kv": {
"entry": "4",
"1oading_time": "0",
"action": "1",
"open_ad_type": "2",
"detail": ""
}
}
]
事件日志的部分数据如下。
"et": [
{
"ett": "1550560414463",
"en": "ad", //广告
"kv": {
"entry": "3",
"show_atyle": "5",
"action": "2",
"detail": "325",
"source": "3",
"behavior": "2",
"content": "2",
"newstype": "3"
}
},
{
"ett": "1550634075998",
"en": "favorites", //收藏
"kv": {
"course_id": 3,
"id": 0,
"add_time": "1550587882792",
"userid": 7
}
}
]
事件日志包括:
- 商品点击(display)
- 商品详情页(newsdetail)
- 商品列表页(loading)
- 广告(ad)
- 消息通知(notification)
- 用户前台活跃(active_foregr ound)
- 用户后台活跃(active_foregound)
- 评论( comment )
- 收藏( favorites)
- 点赞( praise)
- 错误日志数据
在日志打印配置文件中设置日志保存30天到半年,30天是标配。保存日志的目的是Kafka宕机还可以再去日志读。
3.2 数据采集模块
安装 Hadoop、zookeeper、flume、Kafka。
flume采集集群示意图如下,其中有两个自定义拦截器。ETL拦截器过滤掉格式不合格的日志,类型区分拦截器区分启动日志数据和事件日志数据。
flume消费集群:flume消费Kafka数据写到HDFS。示意图如下。
启动顺序:Hadoop集群 -- zookeeper集群 -- flume采集集群 -- Kafka采集集群 -- flume消费集群 -- KafkaManager
停止顺序和启动顺序相反。
3.2.1 搭建Hadoop集群
顺利的话半个小时可搭建完成。搭建集群的核心配置参见。。。
LZO压缩和snappy压缩的异同
LZO | snappy | |
相同点 | 压缩/解压速度也比较快,合理的压缩率; | |
支持hadoop native库; | ||
压缩率比gzip要低; | ||
hadoop本身不支持,需要安装; | ||
不同点 | 支持split,是hadoop中最流行的压缩格式(需要建索引,文件修改后需要重新建索引); | 不支持split; |
可以在linux系统下安装lzop命令,使用方便; | linux系统下没有对应的命令; | |
在应用中对lzo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式); | ||
适用场景 | 综上所述,LZO适用于较大文本的处理 | 综上所述,snappy适用于: ① 当mapreduce作业的map输出的数据比较大的时候,作为map到reduce的中间数据的压缩格式; ②或者作为一个mapreduce作业的输出和另外一个mapreduce作业的输入 |
为什么hadoop没有自带lzo和snappy压缩?
主要是由于lzo和snappy压缩采用的是GPL协议,而hadoop是apache协议,
3.2.2 flume的source组件
在Flume1.7之前如果想要监控一个文件新增的内容,我们一般采用的source 为 exec tail,但是这会有一个弊端,就是当你的服务器宕机重启后,此时数据读取还是从头开始,这显然不是我们想看到的! 在Flume1.7 没有出来之前我们一般的解决思路为:当读取一条记录后,就把当前的记录的行号记录到一个文件中,宕机重启时,我们可以先从文件中获取到最后一次读取文件的行数,然后继续监控读取下去。保证数据不丢失、不重复。
在Flume1.7时新增了一个source 的类型为taildir,它可以监控一个目录下的多个文件,并且实现了实时读取记录保存的断点续传功能。
但是Flume1.7中如果文件重命名,那么会被当成新文件而被重新采集。
4 用户行为数据仓库
4.1 环境准备
需要安装MySQL和hive。
其中hive可以做出优化,改变引擎,不用原来的MapReduce,改用Tez。Tez减少了中间落地磁盘的过程,可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升DAG作业的性能。
4.2 数仓分层搭建
使用hive分析三个主题:用户活跃主题、用户新增主题、用户留存主题
- 创建数据库
- ODS层(创建启动日志表和事件日志表,输入格式为LZO,输出格式为TEXT,只有一个String类型的json字段和一个日期分区)
- DWD层(创建基础明细表,自定义UDF函数和UDTF函数,分别解析公共字段和具体事件字段)
- DWS层(创建 活跃设备明细表、每日新增设备明细表、留存用户明细表 并导入数据)
- ADS层(创建 活跃设备数表、每日新增设备数表、留存用户数/比率表 并导入数据)
5 业务数据仓库
5.1 数仓搭建
5.1.1 在MySQL里生成模拟业务数据
执行 建表脚本
执行 商品分类数据插入脚本,将固定值插入没变化的客观世界的维度的维度表中
base_category1 商品一级分类表
base_category2 商品二级分类表
base_category3 商品三级分类表
执行 存储过程脚本,将模拟数据插入实体表和事实表中,其中存储过程脚本中使用了自定义的函数脚本
实体表
sku_info 商品表
user_info 用户表
事务型事实表
order_detail 订单详情表(交易流水表)
payment_info 支付流水表
周期型事实表
order_info 订单表
5.2.2 业务数据导入数仓
使用sqoop将mysql数据导入HDFS中,每个表的数据导入相应的目录下。
5.2.3 数仓分层搭建
使用hive分析品牌复购率
- ODS层(完全仿照业务数据库中的表字段,一模一样的创建ODS层对应表。将sqoop导入到HDFS中的数据直接加载到表中。)
- DWD层(积压ODS层对数据进行判空过滤。对商品分类表进行维度退化<降维>,即将三个商品分类表和一个商品表合并成一个新的DWD商品表。)
- DWS层(创建 用户行为宽表、用户购买商品明细表<宽表> 并导入数据。)
- ADS层(创建 每日成交总额表、新增用户占日活跃用户比率表、用户行为漏斗分析表 以及 品牌复购率表 并导入数据。)
5.2.4 品牌复购率结果输出到MySQL
使用sqoop将hive表数据对应的HDFS文件导出到mysql中,以供报表分析。
拓展知识:OLAP分析工具之Presto,支持hive数据源,可用于可视化查看hive中的表结构和记录,不能用于增删改。
标签:商数,String,数据仓库,用户,hive,日志,数据 来源: https://blog.csdn.net/qq_40995238/article/details/112862104