其他分享
首页 > 其他分享> > 电商数仓

电商数仓

作者:互联网

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
      }
    }
  ]

事件日志包括:

  1. 商品点击(display)
  2. 商品详情页(newsdetail)
  3. 商品列表页(loading)
  4. 广告(ad)
  5. 消息通知(notification)
  6. 用户前台活跃(active_foregr ound)
  7. 用户后台活跃(active_foregound)
  8. 评论( comment )
  9. 收藏( favorites)
  10. 点赞( praise)
  11. 错误日志数据

在日志打印配置文件中设置日志保存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压缩的异同

 LZOsnappy
相同点压缩/解压速度也比较快,合理的压缩率;
支持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分析三个主题:用户活跃主题、用户新增主题、用户留存主题

  1. 创建数据库
  2. ODS层(创建启动日志表和事件日志表,输入格式为LZO,输出格式为TEXT,只有一个String类型的json字段和一个日期分区)
  3. DWD层(创建基础明细表,自定义UDF函数和UDTF函数,分别解析公共字段和具体事件字段)
  4. DWS层(创建 活跃设备明细表、每日新增设备明细表、留存用户明细表 并导入数据)
  5. 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分析品牌复购率

  1. ODS层(完全仿照业务数据库中的表字段,一模一样的创建ODS层对应表。将sqoop导入到HDFS中的数据直接加载到表中。)
  2. DWD层(积压ODS层对数据进行判空过滤。对商品分类表进行维度退化<降维>,即将三个商品分类表和一个商品表合并成一个新的DWD商品表。)
  3. DWS层(创建 用户行为宽表、用户购买商品明细表<宽表> 并导入数据。)
  4. ADS层(创建 每日成交总额表、新增用户占日活跃用户比率表、用户行为漏斗分析表 以及 品牌复购率表 并导入数据。)

5.2.4 品牌复购率结果输出到MySQL

使用sqoop将hive表数据对应的HDFS文件导出到mysql中,以供报表分析。

拓展知识:OLAP分析工具之Presto,支持hive数据源,可用于可视化查看hive中的表结构和记录,不能用于增删改。

 

标签:商数,String,数据仓库,用户,hive,日志,数据
来源: https://blog.csdn.net/qq_40995238/article/details/112862104