系列文章:
- 遊戲日志分析(1):概覽
- 遊戲日志分析(2):全方位資料采集
- 遊戲日志分析(3):程式日志規範與埋點
- 遊戲日志分析(4):線上問題定位與排查
- 遊戲日志分析(5):資料庫與日志關聯分析
- 遊戲日志分析(6):CDN/對象存儲日志分析
- 遊戲日志分析(7):網絡日志查詢與分析
- 遊戲日志分析(8):資料庫日志分析
- 遊戲日志分析(9):安全日志分析
- 遊戲日志分析(10):資料可視化與報表
- 遊戲日志分析(11):數倉建設
- 遊戲日志分析(12):實時資料處理與流計算
在日志分析場景中,我們經常會遇到資料分散在各地場景,例如:
- 使用者操作、行為相關的資料在日志中
- 使用者屬性、注冊資訊,資金、道具等狀态存在DB中
- 根據1和2我們需要對使用者進行分層統計,将最後的計算結果寫入DB中供報表系統查詢
是以為了做分析,我們要在日志服務Logstore和其他資料源中進行關聯查詢。以下我們就來看一個例子
使用者日志資料
下圖是一條經典的遊戲日志樣例,包括操作、目标、血、魔法值、網絡、支付手段、點選位置、狀态碼、使用者id。日志資料量一般規模會随着使用者數目+活動頻率相關,對一個大型遊戲而言,一天會有幾百G-幾TB規模。
使用者元資訊
日志表示是增量的事件,一些靜态的使用者資訊,例如使用者的性别、注冊時間、地區等等是固定不變的,或者在用戶端很難擷取,不能夠列印到日志裡。我們把這些資訊稱為使用者元資訊。中繼資料一般和使用者數目相關,一般在幾百MB-十幾GB之間。
在分析日志的時候,需要結合事件日志和使用者元資訊才能拿到結果,例如性别對支付行為的影響。性别隻儲存在使用者元資訊中,在日志中則沒有。我們需要通過使用者id把日志和使用者資訊關聯起來分析。
下圖是使用者元資訊樣例,包括了使用者的id、昵稱、性别、年齡、注冊時間、賬戶餘額、省份。
日志服務和MySQL關聯分析
- 日志服務LogStore,提供日志的收集、存儲、查詢分析。
- 日志服務ExternalStore,映射到RDS表。開發者把使用者資訊放到rds表中。
日志服務查詢分析引擎,提供跨LogStore和ExternalStore的查詢分析功能,使用SQL的join文法把日志和使用者元資訊關聯起來。使用者可以用來分析跟使用者屬性相關的名額。
除在查詢過程中引用ExternalStore之外,日志服務還支援将計算結果直接寫入ExternalStore中(例如MySQL),友善結果的進一步處理。
如何使用?
1. 采集日志到日志服務
收集的日志樣例:
2. 建立MySQL表,儲存使用者屬性
建立一張chiji_user表,儲存使用者的id、昵稱、性别、年齡、注冊時間、賬戶餘額、注冊省份。
CREATE TABLE `chiji_user` (
`uid` int(11) NOT NULL DEFAULT '0',
`user_nick` text,
`gender` tinyint(1) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`register_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`balance` float DEFAULT NULL,
`province` text,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
3. 建立ExternalStore
建立ExternalStore需要使用日志服務cli,首先安裝cli:
pip install -U aliyun-log-cli
建立ExternalStore,指定所屬的project,以及ExternalStore的配置檔案/root/config.json
aliyunlog log create_external_store --project_name="log-rds-demo" --config="file:///root/config.json"
/root/config.json的内容是:
{
"externalStoreName": "chiji_user",
"storeType": "rds-vpc",
"parameter": {
"vpc-id": "vpc-m5eq4irc1pucpk85frr5j",
"instance-id": "rm-m5ep2z57814qsn97b",
"host": "rm-m5ep2z57814qsn97b.mysql.rds.aliyuncs.com",
"port": "3306",
"username": "testroot",
"password": "123456789",
"db": "chiji",
"table": "chiji_user",
"region": "cn-qingdao"
}
}
在配置檔案中,指定外部存儲的名稱,以及外部存儲的參數。rds vpc需要指定的參數有:vpc-id ,rds執行個體id,内網域名、端口、使用者名、密碼、資料庫和表名、rds所屬region。
添加白名單
在rds中,添加白名單位址
100.104.0.0/16
如果是mysql,請添加該位址到安全組
4. 關聯分析
4.1 分析活躍使用者的性别分布
使用join文法,通過指定日志中的userid和rds中的uid相等來關聯日志和使用者屬性。
* | select case gender when 1 then '男性' else '女性' end as gender , count(1) as pv
from log l join chiji_user u on l.userid = u.uid group by gender order by pv desc
4.2 分析不同省份的越活度
* | select province , count(1) as pv from log l join chiji_user u on l.userid = u.uid group by province order by pv desc
4.3 分析不同性别的消費情況
* | select case gender when 1 then '男性' else '女性' end as gender , sum(money) as money from log l join chiji_user u on l.userid = u.uid group by gender order by money desc
5. 儲存查詢分析結果
- 首先建立結果表,該表存儲每分鐘的PV值:
CREATE TABLE `report` (
`minute` bigint(20) DEFAULT NULL,
`pv` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 同樣的,參考上文建立ExternalStore的步驟,給report表撞見ExternalStore。
編寫SQL把結果儲存到report:
* | insert into report select __time__- __time__ % 300 as min, count(1) as pv group by min
SQL傳回的結果是最終輸出到rds中的行數。最終report表的結果:
總結
日志服務強大的查詢分析能力,幫助遊戲開發者去分析使用者的習慣。同時,日志服務提供的ExternalStore功能,幫助使用者擴充日志的資訊。通過關聯日志和使用者屬性,擷取更多有價值的資訊。