电商数仓

1 数据仓库的概念

数据仓库(Data Warehouse )可简写为DW或DWH。数据仓库是为企业所有决策制定过程,提供所有系统数据支持的战略集合。

通过对数据仓库中数据的分析,可以帮助企业改进业务流程、控制成本、提高产品质量等。

数据仓库并不是数据的最终目的地,而是为数据最终的目的地做好准备。这些准备包括对数据的清洗、转义、分类、重组、合并、拆分、统计等等。

2 项目需求

1、实时采集埋点的用户行为数据

2、实现数据仓库的分层搭建

3、每天定时导入业务数据

4、根据数据仓库中的数据进行报表分析

电商中最关心的指标:留转GMV复活

留:用户留存——留存用户数表、留存用户比率表

转:转化率——新增用户占日活跃用户比率表、用户行为漏斗分析表

GMV:GMV成交总额——每日成交总额表

复:品牌复购率——品牌复购率表

活:用户活跃——活跃设备数表

3 项目流程概述

电商数仓至少有两个数据来源,一个是业务数据,一个是埋点用户行为数据,这是完全不同的两套系统。

业务交互数据:业务流程中产生的登录、订单、用户、商品、支付等相关的数据,通常存储在DB中,包括Mysql、Oracle等。

埋点用户行为数据:用户在使用产品,即与客户端产品交互过程中产生的数据,比如页面浏览、点击、停留、评论、点赞、收藏等。

Nginx是反向代理服务器,相当于路由,采用轮询方式将数据分配给多个服务器,实现负载均衡。

用户行为数据:由前端埋点产生的日志文件 存储在日志服务器上,通过日志采集flume的拦截器过滤掉不合格的文件并分类后,传输给Kafka集群。在这里,Kafka具有削峰限流的作用,提高项目的稳定性。消费flume从Kafka拉取日志采集flume传过来的数据,然后将数据存储到HDFS中。如果对某些指标分析有实时性要求,可以用SparkStreaming作为消费者去拉取Kafka中的数据,实时分析数据,缩短分析时间。

业务数据:由业务流程产生的数据和部分前端埋点产生的数据存储在业务服务器上的MySQL中,通过sqoop迁移到HDFS中。sqoop迁移一般定时在凌晨3点进行。

开始搭建数仓hive。数仓可分多层,京东甚至分了九层。在这里我们分四层,第一层(ODS)的表直接加载HDFS数据,第二层(DWD)、第三层(DWS)、第四层(ADS)的表数据都是逐层由上一层数据通过hql语句清洗、汇总、统计得出的,我们可以利用presto可视化查看hive中的表结构和记录。项目最后将数仓最后一层的数据导入MySQL中,以供报表系统实现数据可视化。

4 用户行为数据采集

4.1 数据生成模块

用户行为的数据来源于web或app前端的埋点,存储在日志服务器上。如果是开发阶段,没有实际生产数据,可以自己开发Java脚本并利用该数据生成脚本生成模拟数据。数据例子如下:

{
  //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": "[email protected]",  // (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宕机还可以再去日志读。

4.2 数据采集模块

安装 Hadoop、zookeeper、flume、Kafka。

flume采集集群示意图如下,其中有两个自定义拦截器。ETL拦截器过滤掉格式不合格的日志,类型区分拦截器区分启动日志数据和事件日志数据。

flume消费集群:flume消费Kafka数据写到HDFS。示意图如下。

启动顺序:Hadoop集群 -- zookeeper集群 -- flume采集集群 -- Kafka采集集群 -- flume消费集群 -- KafkaManager

停止顺序和启动顺序相反。

4.2.1 搭建Hadoop集群

顺利的话半个小时可搭建完成。搭建集群的核心配置参见。。。

另外添加LZO支持。

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协议。

4.2.2 flume的source组件

在Flume1.7之前如果想要监控一个文件新增的内容,我们一般采用的source 为 exec tail,但是这会有一个弊端,就是当你的服务器宕机重启后,此时数据读取还是从头开始,这显然不是我们想看到的! 在Flume1.7 没有出来之前我们一般的解决思路为:当读取一条记录后,就把当前的记录的行号记录到一个文件中,宕机重启时,我们可以先从文件中获取到最后一次读取文件的行数,然后继续监控读取下去。保证数据不丢失、不重复。

Flume1.7时新增了一个source 的类型为taildir它可以监控一个目录下的多个文件,并且支持断点续传

但是Flume1.7中如果文件重命名,那么会被当成新文件而被重新采集

5 用户行为数据仓库

5.1 环境准备

需要安装MySQL和hive。

其中hive可以做出优化,改变引擎,不用原来的MapReduce,改用Tez。Tez减少了中间落地磁盘的过程,可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升DAG作业的性能。

5.2 数仓分层搭建

使用hive分析三个主题:用户活跃主题、用户新增主题、用户留存主题

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

6 业务数据仓库

6.1 在MySQL里生成模拟业务数据

自定义sql脚本:建表脚本、商品分类数据插入脚本、存储过程脚本、函数脚本。

执行 建表脚本

执行 商品分类数据插入脚本,将固定值插入维度表中

base_category1 商品一级分类表

base_category2 商品二级分类表

base_category3 商品三级分类表

执行 存储过程脚本,将模拟数据插入实体表和事实表中,其中存储过程脚本中使用了自定义的函数脚本

实体表

   sku_info 商品表

   user_info 用户表

事务型事实表

   order_detail 订单详情表(交易流水表)

   payment_info 支付流水表

周期型事实表

   order_info 订单表

6.2 业务数据导入数仓

使用sqoop将mysql数据导入HDFS中,每个表的数据导入相应的目录下。

6.3 数仓分层搭建

使用hive分析品牌复购率

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

 

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_40995238/article/details/112862104