用戶行為采集平臺概述
- 資料倉庫概念
- 專案需求及架構設計
- 專案需求分析
- 專案框架
- 技術選型
- 系統資料流程設計
- 框架版本選型
- 服務器選型
- 集群資源規劃設計
- 用戶行為日志
- 用戶行為日志概述
- 用戶行為日志內容
- 頁面瀏覽記錄
- 動作記錄
- 曝光記錄
- 啟動記錄
- 錯誤記錄
- 用戶行為日志格式
- 頁面日志
- 啟動日志
- 模擬生成用戶行為日志
- 環境準備
- 模擬資料
資料倉庫概念
資料倉庫(Data Warehouse )是為企業所有決策制定程序,提供所有系統資料的戰略集合
通過對資料倉庫中資料的分析,可以幫助企業,改進業務、控制成本、提高產品質量等,
資料倉庫,并不是資料的最終目的地,而是為資料最終的目的地做好準備,
這些準備包括對資料的:
- 清洗
- 轉義
- 分類
- 重組
- 合并
- 拆分
- 統計

專案需求及架構設計
專案需求分析
專案需求 :
- 用戶行為資料采集平臺搭建
- 業務資料采集平臺搭建
- 資料倉庫維度建模
- 分析,設備、會員、商品、地區、活動等電商核心主題,統計的報表指標近100個
- 采用即席查詢工具,隨時進行指標分析
- 對集群性能進行監控,發生例外需要報警
- 元資料管理
- 質量監控
專案框架
技術選型
資料采集傳輸:Flume,DataX , Maxwell , Kafka , Sqoop
資料存盤:MySql ,HDFS,HBase,Redis , MongoDB
資料計算:Hive,Spark,Flink , Tez , Strom
資料查詢:Presto,Kylin,Impala , DataX
資料可視化:Superset , QuickBI , DataV
任務調度:DolphinScheduler、Azkaban、Oozie
集群監控:Zabbix
元資料管理:Atlas
系統資料流程設計

業務互動資料:業務流程中產生的登錄、訂單、用戶、商品、支付等相關的資料,通常存盤在 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/

配置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

讓環境變數生效
source /etc/profile.d/my_env.sh
測驗JDK是否安裝成功
java -version

分發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.yml 、gmall2020-mock-log-2021-10-10.jar 、path.json 、logback.xml 上傳到 cpucode101 的 /opt/module/applog 目錄下
創建 applog 路徑
mkdir /opt/module/applog


組態檔說明
- 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

在 /opt/module/applog/log 目錄下查看生成日志
ll

集群日志生成腳本
查看環境變數
echo $PATH

在 /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

/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

將 jar 包及組態檔上傳至 cpucode102 的 /opt/module/applog/ 路徑

啟動腳本
lg.sh

分別在 cpucode101、cpucode102 的 /opt/module/applog/log 目錄上查看生成的資料


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/434503.html
標籤:其他
