当前位置: 首页 > news >正文

离线数仓搭建_02_服务器配置与数据生产

3.0 数据生成模块(P14-P28)

3.1目标数据

  我们要收集和分析的数据主要包括 页面数据、事件数据、曝光数据、启动数据和错误数据。

3.1.1页面

  页面数据主要记录一个页面的用户访问情况,包括访问时间、停留时间、页面路径等信息。

字段名称字段描述
page_id页面id
home(“首页”),category(“分类页”),discovery(“发现页”),
top_n(“热门排行”),favor(“收藏页”),search(“搜索页”),
good_list(“商品列表页”),good_detail(“商品详情”),
good_spec(“商品规格”),comment(“评价”),
comment_done(“评价完成”),comment_list(“评价列表”),
cart(“购物车”),trade(“下单结算”),payment(“支付页面”),
payment_done(“支付完成”),orders_all(“全部订单”),
orders_unpaid(“订单待支付”),orders_undelivered
(“订单待发货”),orders_unreceipted(“订单待收货”),
orders_wait_comment(“订单待评价”),mine(“我的”),
activity(“活动”),login(“登录”),register(“注册”);
last_page_id上页id
page_item_type页面对象类型
sku_id(“商品skuId”),
keyword(“搜索关键词”),
sku_ids(“多个商品skuId”),
activity_id(“活动id”),
coupon_id(“购物券id”);
page_item页面对象id
sourceType页面来源类型
promotion(“商品推广”),
recommend(“算法推荐商品”),
query(“查询结果商品”),
activity(“促销活动”);
during_time停留时间(毫秒)
ts跳入时间

3.1.2事件(动作)

  事件数据主要记录应用内一个具体操作行为,包括操作类型、操作对象、操作对象描述等信息。

image-20220902141147836

字段名称字段描述
action_id动作idfavor_add(“添加收藏”),favor_canel(“取消收藏”),
cart_add(“添加购物车”),cart_remove(“删除购物车”),
cart_add_num(“增加购物车商品数量”),
cart_minus_num(“减少购物车商品数量”),
trade_add_address(“增加收货地址”),
get_coupon(“领取优惠券”);
注:对于下单、支付等业务数据,可从业务数据库获取。
item_type动作目标类型sku_id(“商品”),coupon_id(“购物券”);
item动作目标id
ts动作时间

3.1.3曝光

  曝光数据主要记录页面所曝光的内容,包括曝光对象,曝光类型等信息。

image-20220902141202500

字段名称字段描述
displayType曝光类型promotion(“商品推广”),recommend(“算法推荐商品”),query(“查询结果商品”),activity(“促销活动”);
item_type曝光对象类型sku_id(“商品skuId”),activity_id(“活动id”);
item曝光对象id
order曝光顺序

3.1.4启动

  启动数据记录应用的启动信息。

image-20220902141228067

字段名称字段描述
entry启动入口icon(“图标”),notification(“通知”),install(“安装后启动”);
loading_time启动加载时间
open_ad_id开屏广告id
open_ad_ms广告播放时间
open_ad_skip_ms用户跳过广告时间
ts启动时间

3.1.5错误

  错误数据记录应用使用

  过程中的错误信息,包括错误编号及错误信息。

字段名称字段描述
error_code错误码
msg错误信息

3.2 数据埋点

image-20220902142957756

3.2.1 主流埋点方式(了解)

  目前主流的埋点方式,有代码埋点(前端/后端)、可视化埋点、全埋点三种。

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

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

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

3.2.2 埋点数据上报时机

埋点数据上报时机包括两种方式。

​   方式一,在离开该页面时,上传在这个页面产生的所有数据(页面、事件、曝光、错误等)。优点,批处理,减少了服务器接收数据压力。缺点,不是特别及时。

​   方式二,每个事件、动作、错误等,产生后,立即发送。优点,响应及时。缺点,对服务器接收数据压力比较大。

​   本次项目采用方式一埋点。

3.2.3 埋点数据日志结构

​  我们的日志结构大致可分为两类,一是普通页面埋点日志,二是启动日志。

​   普通页面日志结构如下,每条日志包含了,当前页面的页面信息,所有事件(动作)、所有曝光信息以及错误信息。除此之外,还包含了一系列公共信息,包括设备信息,地理位置,应用信息等,即下边的common字段。

(1)普通页面埋点日志格式

{
  "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  --跳入时间戳
}

(2)启动日志格式

{
  "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
}

启动日志结构相对简单,主要包含公共信息,启动信息和错误信息。

3.3 服务器和JDK准备

  1. 安装模板虚拟机,IP地址192.168.10.100、主机名称hadoop100、内存4G、硬盘50G

  2. 克隆3台虚拟机

  3. 集群分发脚本xsync

  4. 配置SSH免密登录

  5. 安装JDK

以上内容为Hadoop集群配置相关文件,可参考链接:https://blog.csdn.net/m0_58022371/article/details/126440789

3.3.6 环境变量配置说明

​   Linux的环境变量可在多个文件中配置,如/etc/profile,/etc/profile.d/*.sh,/.bash_profile等,下面说明上述几个文件之间的关系和区别。

​   bash的运行模式可分为login shell和non-login shell。

​   例如,我们通过终端,输入用户名、密码,登录系统之后,得到就是一个login shell。而当我们执行以下命令ssh hadoop103 command,在hadoop103执行command的就是一个non-login shell。

image-20220902144959215

  这两种shell的主要区别在于,它们启动时会加载不同的配置文件,login shell启动时会加载/etc/profile,/.bash_profile,~/.bashrc。non-login shell启动时会加载~/.bashrc。
而在加载/.bashrc(实际是~/.bashrc中加载的/etc/bashrc)或/etc/profile时,都会执行如下代码片段

image-20220902145053443

因此不管是login shell还是non-login shell,启动时都会加载/etc/profile.d/*.sh中的环境变量。

3.4 模拟数据

3.4.1 使用说明

1)将application.yml、gmall2020-mock-log-2021-01-22.jar、path.json、logback.xml上传hadoop102的/opt/module/applog目录下
(1)创建applog路径

[atguigu@hadoop102 module]$ mkdir /opt/module/applog

(2)上传文件application.yml到/opt/module/applog目录

2)配置文件
(1)application.yml文件
可以根据需求生成对应日期的用户行为日志。

[atguigu@hadoop102 applog]$ vim application.yml

修改如下内容

# 外部配置打开
# 外部配置打开
logging.config: "./logback.xml"
#业务日期  注意:并不是Linux系统生成日志的日期,而是生成数据中的时间
mock.date: "2020-06-14"

#模拟数据发送模式
#mock.type: "http"
#mock.type: "kafka"
mock.type: "log"

#http模式下,发送的地址
mock.url: "http://hdp1/applog"

#kafka模式下,发送的地址
mock:
  kafka-server: "hdp1:9092,hdp2:9092,hdp3:9092"
  kafka-topic: "ODS_BASE_LOG"
#启动次数
mock.startup.count: 200
#设备最大值
mock.max.mid: 500000
#会员最大值
mock.max.uid: 100
#商品最大值
mock.max.sku-id: 35
#页面平均访问时间
mock.page.during-time-ms: 20000
#错误概率 百分比
mock.error.rate: 3
#每条日志发送延迟 ms
mock.log.sleep: 10
#商品详情来源  用户查询,商品推广,智能推荐, 促销活动
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,苹果手机,小米盒子"

(2)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":40 },
	{"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":10 },
	{"path":["home"  ],"rate":10 }
]

(3)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.atgugu.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" />
</root>
</configuration>

3)生成日志
(1)进入到/opt/module/applog路径,执行以下命令

[atguigu@hadoop102 applog]$ java -jar gmall2020-mock-log-2021-01-22.jar

(2)在/opt/module/applog/log目录下查看生成日志

[atguigu@hadoop102 log]$ ll

3.4.2集群日志生成脚本

在hadoop102的/home/atguigu目录下创建bin目录,这样脚本可以在服务器的任何目录执行。

​ (1)在/home/atguigu/bin目录下创建脚本lg.sh

[atguigu@hadoop102 bin]$ vim lg.sh

​ (2)在脚本中编写如下内容

#!/bin/bash
for i in hadoop102 hadoop103; do
    echo "========== $i =========="
    ssh $i "cd /opt/module/applog/; java -jar gmall2020-mock-log-2021-01-22.jar >/dev/null 2>&1 &"
done 
注:
①/opt/module/applog/为jar包及配置文件所在路径
②/dev/null代表Linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。
标准输入0:从键盘获得输入 /proc/self/fd/0 
标准输出1:输出到屏幕(即控制台) /proc/self/fd/1 
错误输出2:输出到屏幕(即控制台) /proc/self/fd/2
(3)修改脚本执行权限
[atguigu@hadoop102 bin]$ chmod u+x lg.sh
(4)将jar包及配置文件上传至hadoop103的/opt/module/applog/路径
(5)启动脚本
[atguigu@hadoop102 module]$ lg.sh 
(6)分别在hadoop102、hadoop103的/opt/module/applog/log目录上查看生成的数据
[atguigu@hadoop102 logs]$ ls
app.2020-06-14.log
[atguigu@hadoop103 logs]$ ls
app.2020-06-14.log

相关文章:

  • 猿创征文|我的四个月Java学习成长之路——从基础到框架再到项目
  • 【毕业设计】试卷自动批改系统 - opencv python 机器视觉
  • 神经网络算法有哪些模型,神经网络模型应用实例
  • 微信公众号题库接口系统 内部含有接口授权使用
  • (附源码)springboot美食分享系统 毕业设计 612231
  • 视频产生的本质及色彩空间:RGB 和 YUV
  • 002-JVM 常用命令
  • 数据分析报告常见步骤
  • “零”成本即可搭建OA系统,终于知道低代码平台为什么那么火
  • 【芯片前端】延迟一拍出数的握手型ram结构的一次探索
  • 计算机毕业设计php+vue基于微信小程序的高校新生报到管理小程序
  • jq/h5 实现实时获取大文件下载进度
  • 【从零开始的Java开发】2-9-3 油画商城静态网页案例
  • 计算机毕业设计ssm+vue基本微信小程序的个人健康管理系统
  • 【PTHREAD】线程互斥与同步之互斥锁
  • 【剑指offer】让抽象问题具体化
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 30秒的PHP代码片段(1)数组 - Array
  • Angular4 模板式表单用法以及验证
  • const let
  • docker容器内的网络抓包
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • js ES6 求数组的交集,并集,还有差集
  • MySQL QA
  • orm2 中文文档 3.1 模型属性
  • Python socket服务器端、客户端传送信息
  • SQLServer插入数据
  • 从PHP迁移至Golang - 基础篇
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 类orAPI - 收藏集 - 掘金
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微服务核心架构梳理
  • 我与Jetbrains的这些年
  • 用element的upload组件实现多图片上传和压缩
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 转载:[译] 内容加速黑科技趣谈
  • hi-nginx-1.3.4编译安装
  • 如何正确理解,内页权重高于首页?
  • 我们雇佣了一只大猴子...
  • ​Linux·i2c驱动架构​
  • !!Dom4j 学习笔记
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $L^p$ 调和函数恒为零
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (pojstep1.3.1)1017(构造法模拟)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)可以带来幸福的一本书
  • ***测试-HTTP方法
  • .net对接阿里云CSB服务