1. 用户行为采集平台概述

  • 数据仓库概念
  • 项目需求及架构设计
  • 项目需求分析
  • 项目框架
  • 技术选型
  • 系统数据流程设计
  • 框架版本选型
  • 服务器选型
  • 集群资源规划设计
  • 用户行为日志
  • 用户行为日志概述
  • 用户行为日志内容
  • 页面浏览记录
  • 动作记录
  • 曝光记录
  • 启动记录
  • 错误记录
  • 用户行为日志格式
  • 页面日志
  • 启动日志
  • 模拟生成用户行为日志
  • 环境准备
  • 模拟数据


数据仓库概念

数据仓库(Data Warehouse )是为企业所有决策制定过程,提供所有系统数据的战略集合

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

数据仓库,并不是数据的最终目的地,而是为数据最终的目的地做好准备。

这些准备包括对数据的:

  • 清洗
  • 转义
  • 分类
  • 重组
  • 合并
  • 拆分
  • 统计

通用数据采集平台功能架构 数据采集平台产品介绍_hadoop

项目需求及架构设计

项目需求分析

项目需求 :

  • 用户行为数据采集平台搭建
  • 业务数据采集平台搭建
  • 数据仓库维度建模
  • 分析,设备、会员、商品、地区、活动等电商核心主题,统计的报表指标近100个
  • 采用即席查询工具,随时进行指标分析
  • 对集群性能进行监控,发生异常需要报警
  • 元数据管理
  • 质量监控

项目框架

技术选型

数据采集传输:FlumeDataX , Maxwell , Kafka , Sqoop

数据存储:MySqlHDFSHBaseRedis , MongoDB

数据计算:HiveSparkFlink , Tez , Strom

数据查询:PrestoKylin,Impala , DataX

数据可视化:Superset , QuickBI , DataV

任务调度:DolphinScheduler、Azkaban、Oozie

集群监控:Zabbix

元数据管理:Atlas

系统数据流程设计

通用数据采集平台功能架构 数据采集平台产品介绍_分布式_02

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

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

框架版本选型

Apache:运维麻烦,组件间兼容性需要自己调研。(一般大厂使用,技术实力雄厚,有专业的运维人员)(建议使用)

CDH::国内使用最多的版本,但CM不开源,今年开始要收费,一个节点1万美金

HDP:开源,可以进行二次开发,但是没有CDH稳定,国内使用较少

产品

版本

Java

1.8

Hadoop

3.1.3

Hive

3.1.2

Flume

1.9.0

Zookeeper

3.5.7

Kafka

2.4.1

DataX

3.0

Maxwell

1.29.2

框架选型尽量不要选择最新的框架 , 选择最新框架半年前左右的稳定版

服务器选型

物理机:

  • 以128G内存,20核物理CPU,40线程,8THDD和2TSSD硬盘,戴尔品牌单台报价4W出头。一般物理机寿命5年左右
  • 需要有专业的运维人员,平均一个月1万。电费也是不少的开销

云主机:

  • 以阿里云为例,差不多相同配置,每年5W,主要磁盘贵
  • 很多运维工作都由阿里云完成,运维相对较轻松

企业选择 :

  • 金融有钱公司和阿里没有直接冲突的公司选择阿里云
  • 中小公司、为了融资上市,选择阿里云,拉倒融资后买物理机
  • 有长期打算,资金比较足,选择物理机

集群资源规划设计

(假设:每台服务器 8T 磁盘,128G 内存)

  • 每天日活跃用户 100 万,每人一天平均 100 条:100万 * 100条 = 1亿条
  • 每条日志 1K 左右,每天 1 亿条:100000000 / 1024 / 1024 = 约100G
  • 半年内不扩容服务器来算:100G * 180天 = 约18T
  • 保存 3 副本:18T * 3 = 54T
  • 预留20% 30%Buf = 54T / 0.7 = 77T

约 8T * 10 台服务器

集群服务器规划 :

服务名称

子服务

服务器 cpucode101

服务器 cpucode102

服务器 cpucode103

HDFS

NameNode


DataNode




SecondaryNameNode


Yarn

NodeManager




Resourcemanager


Zookeeper

Zookeeper Server




Flume(采集日志)

Flume



Flume(消费Kafka)

Flume


Kafka

Kafka




Hive

Hive


MySQL

MySQL


DataX

DataX


Maxwell

Maxwell


Presto

Coordinator


Worker




DolphinScheduler

MasterServer


WorkerServer




Druid

Druid




Kylin


Hbase

HMaster


HRegionServer




Superset


Atlas


Solr

Jar




用户行为日志

用户行为日志概述

用户行为日志的内容 : 用户的各项行为信息以及行为所处的环境信息

收集信息的目的 : 优化产品和为各项分析统计指标提供数据支撑

收集这些信息的手段 : 埋点

埋点方式 :

  • 有代码埋点(前端/后端)
  • 可视化埋点
  • 全埋点

代码埋点 : 通过调用埋点SDK函数,在需要埋点的业务逻辑功能位置调用接口,上报埋点数据。如 : 我们对页面中的某个按钮埋点后,当这个按钮被点击时,可以在这个按钮对应的 OnClick 函数里面调用SDK提供的数据发送接口,来发送数据 ( 业务处理 )

可视化埋点 : 只需要研发人员集成采集 SDK,不需要写埋点代码,业务人员就可以通过访问分析平台的“圈选”功能,来“圈”出需要对用户行为进行捕捉的控件,并对该事件进行命名。圈选完毕后,这些配置会同步到各个用户的终端上,由采集 SDK 按照圈选的配置自动进行用户行为数据的采集和发送 ( 花钱 )

全埋点 : 通过在产品中嵌入SDK,前端自动采集页面上的全部用户行为事件,上报埋点数据,相当于做了一个统一的埋点。然后再通过界面配置哪些数据需要在系统里面进行分析 ( 大公司 )

用户行为日志内容

收集和分析的用户行为信息 :

  • 页面浏览记录
  • 动作记录
  • 曝光记录
  • 启动记录
  • 错误记录

页面浏览记录

页面浏览记录 : 记录访客对页面的浏览行为

浏览行为的环境信息 :

  • 用户信息
  • 时间信息
  • 地理位置信息
  • 设备信息
  • 应用信息
  • 渠道信息
  • 页面信息

用户信息

包括用户ID、设备ID

时间信息

用户跳入页面的时间

地理位置信息

用户浏览页面时所处的地理位置

设备信息

包括设备品牌、设备型号、设备系统

应用信息

指用户访问的应用信息,例如应用版本

渠道信息

指应用的下载渠道

页面信息

用户浏览的页面相关信息,包括页面ID,页面对象

动作记录

动作记录 : 记录的是用户的业务操作行为

业务操作行为的环境信息 :

  • 用户信息
  • 时间信息
  • 地理位置信息
  • 设备信息
  • 应用信息
  • 渠道信息
  • 动作目标对象信息

用户信息

包括用户ID、设备ID

时间信息

动作时间

地理位置信息

动作发生时所处的地理位置

设备信息

设备品牌、设备型号、设备系统

应用信息

用户访问的应用信息,例如应用版本

渠道信息

应用的下载渠道

动作目标信息

动作目标对象相关信息,包括对象类型,对象ID

曝光记录

曝光记录 : 曝光行为

曝光行为的环境信息 :

  • 用户信息
  • 时间信息
  • 地理位置信息
  • 设备信息
  • 应用信息
  • 渠道信息
  • 曝光对象信息等

用户信息

包括甲户ID、设备ID

时间信息

曝光时间

地理位置信息

曝光行为发生时所处的地理位置

设备信息

设备品牌、设备型号、设备系统

应用信息

用户访问的应用信息,例如应用版本

渠道信息

指应用的下载渠道

曝光对象信息

曝光对象相关信息,包括对象类型,对象ID

启动记录

启动记录 : 用户启动应用的行为

启动行为的环境信息 :

  • 用户信息
  • 时间信息
  • 地理位置信息
  • 设备信息
  • 应用信息
  • 渠道信息
  • 启动类型
  • 开屏广告信息

用户信息

用户ID、设备ID

时间信息

启动时间

地理位置信息

启动时所处的地理位置

设备信息

设备品牌、设备型号、设备系统

应用信息

用户访问的应用信息,例如应用版本

渠道信息

应用的下载渠道

启动类型

图标和推送

开屏广告信息

广告ID等信息

错误记录

错误记录 : 记录用户在使用应用过程中的报错行为

报错行为的环境信息 :

  • 用户信息
  • 时间信息
  • 地理位置信息
  • 设备信息
  • 应用信息
  • 渠道信息
  • 可能与报错相关的页面信息
  • 动作信息
  • 曝光信息
  • 动作信息

用户行为日志格式

日志结构分为两类 :

  • 页面日志
  • 启动日志

页面日志

页面日志 : 以页面浏览为单位,即一个页面浏览记录,生成一条页面埋点日志

一条完整的页面日志包含,一个页面浏览记录,若干个用户在该页面所做的动作记录,若干个该页面的曝光记录,以及一个在该页面发生的报错记录

页面日志环境信息 :

  • 用户信息
  • 时间信息
  • 地理位置信息
  • 设备信息
  • 应用信息
  • 渠道信息
{
	"common": {                      -- 环境信息
		"ar": "230000",              -- 地区编码
		"ba": "iPhone",              -- 手机品牌
		"ch": "Appstore",            -- 渠道
		"is_new": "1",				 --是否首日使用,首次使用的当日,该字段值为1,过了24:00,该字段置为0。
		"md": "iPhone 8",            -- 手机型号
		"mid": "YXfhjAYH6As2z9Iq",   -- 设备id
		"os": "iOS 13.2.9",          -- 操作系统
		"uid": "485",                -- 会员id
		"vc": "v2.1.134"             -- app版本号
	},
	"actions": [{                     --动作(事件)  
		"action_id": "favor_add",     --动作id
		"item": "3",                  --目标id
		"item_type": "sku_id",        --目标类型
		"ts": 1585744376605           --动作时间戳
	}
	],
	"displays": [{
		"displayType": "query",        -- 曝光类型
		"item": "3",                   -- 曝光对象id
		"item_type": "sku_id",         -- 曝光对象类型
		"order": 1,                    --出现顺序
		"pos_id": 2                    --曝光位置
	},{
		"displayType": "promotion",
		"item": "6",
		"item_type": "sku_id",
		"order": 2, 
		"pos_id": 1
	},{
		"displayType": "promotion",
		"item": "9",
		"item_type": "sku_id",
		"order": 3, 
		"pos_id": 3
	},{
		"displayType": "recommend",
		"item": "6",
		"item_type": "sku_id",
		"order": 4, 
		"pos_id": 2
	},{
		"displayType": "query ",
		"item": "6",
		"item_type": "sku_id",
		"order": 5, 
		"pos_id": 1
	}
	],
	"page": {                       --页面信息
		"during_time": 7648,        -- 持续时间毫秒
		"item": "3",                -- 目标id
		"item_type": "sku_id",      -- 目标类型
		"last_page_id": "login",    -- 上页类型
		"page_id": "good_detail",   -- 页面ID
		"sourceType": "promotion"   -- 来源类型
	},
	"err":{                     --错误
		"error_code": "1234",      --错误码
		"msg": "***********"       --错误信息
	},
	"ts": 1585744374423  --跳入时间戳
}

启动日志

启动日志以启动为单位,及一次启动行为,生成一条启动日志

一条完整的启动日志包括一个启动记录,一个本次启动时的报错记录,以及启动时所处的环境信息

  • 用户信息
  • 时间信息
  • 地理位置信息
  • 设备信息
  • 应用信息
  • 渠道信息
{
	"common": {
		"ar": "370000",
		"ba": "Honor",
		"ch": "wandoujia",
		"is_new": "1",
		"md": "Honor 20s",
		"mid": "eQF5boERMJFOujcp",
		"os": "Android 11.0",
		"uid": "76",
		"vc": "v2.1.134"
	},
	"start": {
		"entry": "icon",          --icon手机图标  notice 通知   install 安装后启动
		"loading_time": 18803,    --启动加载时间
		"open_ad_id": 7,          --广告页ID
		"open_ad_ms": 3449,       -- 广告总共播放时间
		"open_ad_skip_ms": 1989   --  用户跳过广告时点
	},
	"err":{                        --错误
		"error_code": "1234",      --错误码
		"msg": "***********"       --错误信息
	},
	"ts": 1585744304000
}

模拟生成用户行为日志

环境准备

JDK准备

卸载现有JDK(3台节点)

sudo rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps

在 Linux 系统下的 opt 目录中查看软件包是否导入成功

ls /opt/software/

解压 JDK 到 /opt/module 目录下

tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

通用数据采集平台功能架构 数据采集平台产品介绍_数据仓库_03

配置JDK环境变量

新建 /etc/profile.d/my_env.sh 文件

sudo vim /etc/profile.d/my_env.sh

添加如下内容,然后保存(:wq)退出

#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

通用数据采集平台功能架构 数据采集平台产品介绍_big data_04

让环境变量生效

source /etc/profile.d/my_env.sh

测试JDK是否安装成功

java -version

通用数据采集平台功能架构 数据采集平台产品介绍_通用数据采集平台功能架构_05

分发JDK

xsync /opt/module/jdk1.8.0_212/

分发环境变量配置文件

sudo /home/cpu/bin/xsync /etc/profile.d/my_env.sh

分别在 cpucode102、cpucode103 上执行 source

source /etc/profile.d/my_env.sh

环境变量配置说明

Linux 的环境变量可在多个文件中配置 :

  • /etc/profile
  • /etc/profile.d/*.sh
  • ~/.bashrc
  • ~/.bash_profile

bash的运行模式 :

  • login shell : 通过终端,输入用户名、密码,登录系统
  • non-login shell

login shell 启动时会加载 /etc/profile~/.bash_profile~/.bashrc

non-login shell 启动时会加载 ~/.bashrc

模拟数据

上传模拟器

application.ymlgmall2020-mock-log-2021-10-10.jarpath.jsonlogback.xml 上传到 cpucode101/opt/module/applog 目录下

创建 applog 路径

mkdir /opt/module/applog

通用数据采集平台功能架构 数据采集平台产品介绍_分布式_06

通用数据采集平台功能架构 数据采集平台产品介绍_分布式_07

配置文件说明

  • application.yml文件

根据需求生成对应日期的用户行为日志

# 外部配置打开
logging.config: "./logback.xml"
#业务日期
mock.date: "2020-06-14"

  #模拟数据发送模式
mock.type: "log"
#mock.type: "http"
#mock.type: "kafka"
  #http模式下,发送的地址
mock.url: "http://localhost:8090/applog"

mock:
  kafka-server: "hdp1:9092,hdp2:9092,hdp3:9092"
  kafka-topic: "ODS_BASE_LOG"

  #启动次数
mock.startup.count: 200
  #设备最大值
mock.max.mid: 1000000
  #会员最大值
mock.max.uid: 1000
  #商品最大值
mock.max.sku-id: 35
  #页面平均访问时间
mock.page.during-time-ms: 20000
  #错误概率 百分比
mock.error.rate: 3
  #每条日志发送延迟 ms
mock.log.sleep: 20
  #商品详情来源  用户查询,商品推广,智能推荐, 促销活动
mock.detail.source-type-rate: "40:25:15:20"

#领取购物券概率
mock.if_get_coupon_rate: 75

#购物券最大id
mock.max.coupon-id: 3

  #搜索关键词  
mock.search.keyword: "图书,小米,iphone11,电视,口红,ps5,苹果手机,小米盒子"

# 男女浏览商品比重(35sku)
mock.sku-weight.male: "10:10:10:10:10:10:10:5:5:5:5:5:10:10:10:10:12:12:12:12:12:5:5:5:5:3:3:3:3:3:3:3:3:10:10"
mock.sku-weight.female: "1:1:1:1:1:1:1:5:5:5:5:5:1:1:1:1:2:2:2:2:2:8:8:8:8:15:15:15:15:15:15:15:15:1:1"
  • path.json

配置访问路径,可以根据需求,灵活配置用户访问路径

[
  {"path":["home","good_list","good_detail","cart","trade","payment"],"rate":20 },
  {"path":["home","search","good_list","good_detail","login","good_detail","cart","trade","payment"],"rate":30 },
  {"path":["home","search","good_list","good_detail","login","register","good_detail","cart","trade","payment"],"rate":20 },
  {"path":["home","mine","orders_unpaid","trade","payment"],"rate":10 },
  {"path":["home","mine","orders_unpaid","good_detail","good_spec","comment","trade","payment"],"rate":5 },
  {"path":["home","mine","orders_unpaid","good_detail","good_spec","comment","home"],"rate":5 },
  {"path":["home","good_detail"],"rate":20 },
  {"path":["home"  ],"rate":10 }
]
  • logback配置文件

可配置日志生成路径

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_HOME" value="/opt/module/applog/log" />
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    <!-- 将某一个包下日志单独打印日志 -->
    <logger name="com.atguigu.gmall2020.mock.log.util.LogUtil"
            level="INFO" additivity="false">
        <appender-ref ref="rollingFile" />
         <appender-ref ref="console" />
    </logger>

    <root level="error"  >
        <appender-ref ref="console" />
        <!-- <appender-ref ref="async-rollingFile" />  -->
    </root>
</configuration>

生成日志

进入到 /opt/module/applog 路径,执行以下命令

java -jar gmall2020-mock-log-2021-10-10.jar

通用数据采集平台功能架构 数据采集平台产品介绍_通用数据采集平台功能架构_08

/opt/module/applog/log 目录下查看生成日志

ll

通用数据采集平台功能架构 数据采集平台产品介绍_big data_09

集群日志生成脚本

查看环境变量

echo $PATH

通用数据采集平台功能架构 数据采集平台产品介绍_hadoop_10

/usr/local/sbin 目录下创建脚本 lg.sh

在脚本中编写如下内容

#!/bin/bash
for i in cpucode101 cpucode102; do
    echo "========== $i =========="
    ssh $i "cd /opt/module/applog/; nohup java -jar gmall2020-mock-log-2021-10-10.jar >/dev/null 2>&1 &"
done

通用数据采集平台功能架构 数据采集平台产品介绍_hadoop_11

  • /opt/module/applog/为jar包及配置文件所在路径
  • /dev/null 代表 linux 的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”

标准输入0:从键盘获得输入 /proc/self/fd/0

标准输出1:输出到屏幕(即控制台) /proc/self/fd/1

错误输出2:输出到屏幕(即控制台) /proc/self/fd/2

修改脚本执行权限

chmod 777 lg.sh

通用数据采集平台功能架构 数据采集平台产品介绍_分布式_12

将 jar 包及配置文件上传至 cpucode102 的 /opt/module/applog/ 路径

通用数据采集平台功能架构 数据采集平台产品介绍_hadoop_13

启动脚本

lg.sh

通用数据采集平台功能架构 数据采集平台产品介绍_数据仓库_14

分别在 cpucode101、cpucode102 的 /opt/module/applog/log 目录上查看生成的数据

通用数据采集平台功能架构 数据采集平台产品介绍_通用数据采集平台功能架构_15

通用数据采集平台功能架构 数据采集平台产品介绍_hadoop_16

用户行为采集平台搭建