基於阿里雲實現遊戲數據運營(附Demo)
摘要: 通過閱讀本文,您可以學會怎樣使用阿里雲的maxcompute搭建一套數據分析系統。
原作者:阿里雲解決方案架構師,陸寶。
原文
一、總覽
一個遊戲/系統的業務數據分析,總體可以分為圖示的幾個關鍵步驟:
1、數據採集:通過SDK埋點或者服務端的方式獲取業務數據,並通過分散式日誌收集系統,將各個伺服器中的數據收集起來並送到指定的地方去,比如HDFS等;(註:本文Demo中,使用flume,也可選用logstash、Fluentd等)
2、數據同步:構建數據通道,接受數據採集agent的數據流,並且分發到不同的存儲/計算引擎中去;(註:本文Demo中,使用阿里雲datahub作為通道,maxcompute作為存儲/計算引擎)
3、數據開發:按照日誌格式、業務領域,構建數據模型;(註:本文Demo中,在maxcompute中創建對應的project、table)
4、數據計算/分析:按照業務場景的分析要求,編寫SQL腳本 或者 使用工具,完成數據的分析及展現;(註:本文Demo中,基於阿里雲quickBI,完成多維分析、儀錶盤的配置)
接下來按照上述步驟,給大家具體介紹,如何利用相關的平台/工具,實現一個簡單的數據分析場景。
二、環境準備
首先,需要準備一台伺服器,作為日誌採集的agent,此處選用阿里雲的ECS(具體ECS選購過程不再贅述),伺服器配置信息:
實例規格:4 核 16GB
地域:華東 1(華東 1 可用區 F)
操作系統:CentOS 7.4 64位
網路類型:專有網路
安全組:允許遠程ssh
本地遠程登錄ECS伺服器
ssh {username}@{host}
Step1:安裝JDK
Flume運行依賴java環境,因此需要在伺服器安裝SDK,本文採用先下載到本地,再上傳伺服器的方式安裝。
1、下載並上傳SDK (demo選用jdk1.8.0_151,可至oracle官網下載)
scp {本地文件路徑} {username}@{host}:{伺服器目錄}
2、上傳完成,解壓並設置相應的環境變數:
- tar -zxvf {jdk壓縮包名}
- 環境變數設置
# vi /etc/profile
增加:
export JAVA_HOME={jdk目錄}
export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME JRE_HOME CLASS_PATH PATH
#source /etc/profile
3、檢查SDK是否安裝完成:
java -version
Step2:安裝flume
同樣,對於flume,也可採用先下載到本地,再上傳伺服器的方式安裝。
1、下載並上傳flume安裝文件 (demo選用apache-flume-1.8.0,可至apache官網下載)
scp {本地文件路徑} {username}@{host}:{伺服器目錄}
2、上傳完成,解壓並設置相應的環境變數
- tar -zxvf {flume壓縮包名}
- 環境變數設置
# vi /etc/profile
增加:
export FLUME_HOME=/usr/local/flume
修改:
path= $path :$FLUME_HOME/bin
#source /etc/profile
3、檢查flume是否安裝完成:
#此處注意,需要寫flume安裝的全路徑
{flume安裝路徑}/bin/flume-ng version
Step3:安裝Datahub Sink插件
因為Demo選用datahub作為數據通道,所以還需要安裝flume-datahub的插件,該文件不大,此處可以選擇直接在伺服器下載安裝。
1、下載flume-datahub插件包
wget https://github.com/aliyun/aliyun-odps-flume-plugin/releases/download/1.1.0/flume-datahub-sink-1.1.0.tar.gz
2、解壓並部署插件
- tar zxvf flume-datahub-sink-1.1.0.tar.gz
- 將解壓後的插件文件夾移動到Flume安裝目錄下
# mkdir /usr/local/flume/plugins.d
# mv flume-datahub-sink /usr/local/flume/plugins.d/
OK,環境準備工作,到此就基本完成了。
三、數據開發
Demo使用阿里雲大數據服務maxCompute作為存儲計算引擎。
Step1:開通maxcompute服務
阿里雲實名認證賬號訪問https://www.aliyun.com/product/odps ,開通maxcompute,此處選擇按量付費進行購買。
Step2:創建項目及業務模型
1、進入數加控制台 https://data.aliyun.com/console ,點擊「dataworks->項目列表」;
2、點擊頁面「創建項目」按鈕,輸入project的基本信息,點擊確定,會有一個短暫的初始化過程;
3、點擊項目列表下對應項目操作欄,進入dataworks的數據開發頁面;
4、創建腳本文件:點擊頂部菜單欄中的數據開發,點擊「新建」處新建腳本,也可直接點擊「新建腳本」任務框;
5、按照需求,設計對應的業務模型,並通過腳本完成模型創建;
#此處按照場景示例,選擇創建
- 事實表:充值記錄,與日誌文件recharge_record_log對應;
- 維表:商品信息;
#建表語句示例(同時維表可做數據初始化)
create table if not exists recharge_record_log(
recharge_time string comment 充值時間,
…
item_id string comment 商品ID
)
註:具體可以參考對應的建表腳本(建表及維表初始化腳本.sql)
可在數據開發的IDE環境編寫、調測腳本:
OK,數據建模的工作,到此就基本完成了。
四、數據同步
step1:數據通道設置
Demo使用阿里雲datahub作為數據同步的通道。
1、首先,申請開通datahub服務(公測中,鏈接);
2、進入Datahub的管理控制台-項目管理(鏈接),創建project;
3、進入創建好的project,點擊「創建topic」;
需要注意,此處的topic內容需要與日誌文件、表的結構一致,此處可以選擇「導入MaxCompute表結構」的方式,填寫相應信息,快速完成創建;
step2:數據採集agent配置及啟動
登錄安裝了flume環境的ECS伺服器,配置、啟動日誌採集agent,並對接datahub的數據通道;
1、數據準備:通過手工方式,上傳準備好的日誌文件(實際應用場景中,應該是通過服務寫入);
2、Flume作業配置:
1)在Flume安裝目錄的conf文件夾下,創建任務的conf文件;
vi {任務名稱}.conf
2)輸入任務的配置信息
#示例如下(重點關注{}中的內容)
#a1是要啟動的agent的名字
a1.sources = r1 #命名agent的sources為r1
a1.sinks = k1 #命名agent的sinks為k1
a1.channels = c1 #命名agent的channels為c1
# Describe/configure the source
a1.sources.r1.type = exec #指定r1的類型為exec
a1.sources.r1.command =cat {日誌文件的位置} #寫入本地文件路徑
# Describe the sink
a1.sinks.k1.type = com.aliyun.datahub.flume.sink.DatahubSink #指定k1的類型
a1.sinks.k1.datahub.accessID ={ accessID }
a1.sinks.k1.datahub.accessKey ={ accessKey }
a1.sinks.k1.datahub.endPoint = http://dh-cn-hangzhou.aliyuncs.com
a1.sinks.k1.datahub.project = {datahub_project_name}
a1.sinks.k1.datahub.topic ={datahub_ topic _name}
a1.sinks.k1.batchSize = 100 #一次寫入文件條數
a1.sinks.k1.serializer = DELIMITED
a1.sinks.k1.serializer.delimiter = {欄位間隔符}
a1.sinks.k1.serializer.fieldnames= {欄位 「,」 隔開,注意需要與日誌文件的順序、datahub topic的順序保持一致}
a1.sinks.k1.serializer.charset = {文字編碼格式}
a1.sinks.k1.shard.number = {分片數,需要與datahub 的topic配置一致}
a1.sinks.k1.shard.maxTimeOut = 60
# Use a channel which buffers events in memory
a1.channels.c1.type = memory #指定channel的類型為memory
a1.channels.c1.capacity = 1000 #設置channel的最大存儲數量為1000
a1.channels.c1.transactionCapacity = 1000 #每次最大可從source中拿到或送到sink中的event數量是1000
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3、檢查無誤後,啟動flume日誌採集agent;
bin/flume-ng agent -n a1 -c conf -f conf/ {任務名稱}
.conf -Dflume.root.logger=INFO,console
如果能正常啟動,可以看到數據正在按照配置往datahub中同步;
step3:數據檢查
在datahub的topic頁面,可以看到數據同步的情況:
可以通過兩種方式來檢查數據:
1、topic的數據抽樣,查看數據格式是否正常;
2、因為已經配置了datahub到maxcompute的數據鏈路,可以在maxcompute中檢查數據入庫情況;
OK,數據同步的工作,到此就基本完成了。
五、數據分析&報表製作
接下來需要基於日誌,做業務分析,那麼這裡我們可以選擇quickBI工具,來快速完成多維分析報表、儀錶盤等數據產品的配置;
通過 鏈接 ,打開quickBI的產品頁面,並開通對應服務。
Step1:分析模型設置(數據集)
1、進入數據工作台https://das.base.shuju.aliyun.com/console.htm,點擊左側QuickBI;
2、在引導頁,點擊「添加數據源」;
3、設置數據源的屬性
按demo場景,選擇maxcompute;
並設置對應的peoject信息:
4、數據源連接成功後,可以看到project下的表,選擇需要分析的表,創建數據集;
5、按照分析場景需求,可以對數據集的邏輯模型做設置;
demo的分析場景,需要 基於事實表(充值數據,recharge_record_log)和維表(商品信息表,t_item_record)關聯,來完成業務分析,因此可以點擊編輯數據集:
完成:
1)構建關聯模型
2)可以對時間維度做拆分,會自動生成多個level
Step2:多維分析報表配置
1、分析模型設置好之後,接下來就可以開始分析了,點擊「表格分析」:
2、進入多維分析報表的IDE工作台:
3、可以看到,左側的欄位屬性區,會自動載入物理表的對應欄位(默認載入comment描述):
4、具體分析操作,比較簡單,按需雙擊、拖拽需要分析的欄位,點擊查詢即可看到報表,比如:
1)按商品(維度),看充值(計量)的整體情況
2)增加角色等級(維度),做交叉表
3)同時也支持各種查詢條件的設置
按時間
多層嵌套的高級查詢
Step3:儀錶盤、數據產品配置
靈活性較強的數據探查類場景,可以通過多維報表支撐,對於展現形式要求較高的,可以通過儀錶盤來靈活實現;
1、數據集List頁面,點擊「新建儀錶盤」:
2、進入儀錶盤的IDE工作台,頁面分為左、中、右三欄:
3、同樣,可以通過拖拽的方式,快速完成儀錶盤頁面的配置:
1)拖拽/雙擊 選擇需要作圖的欄位:
2)點擊更新,刷新圖表,同時可以自由設置圖表的樣式
3)拖拽設置頁面布局
比如,可以做一個專門的充值分析頁面,效果示例:
數據產品是類似於分析專題、報表門戶,具體配置就不再贅述:
六、架構總結
一、Demo涉及的產品 以及 數據流
如圖所示:
二、如何實現生產場景下的動態數據採集及常見問題處理
和Demo不同的是,在生產場景下,我們的日誌文件是動態的,因此需要實現如下邏輯:
- 監控日誌目錄下的文件變化;
- 根據配置的頻率,採集日誌;
1、flume1.7及以上版本
包含TaildirSource組件,可以實現監控目錄,並且使用正則表達式匹配該目錄中的文件名進行實時收集。
Flume作業配置:
1)在Flume安裝目錄的conf文件夾下,創建任務的conf文件;
vi {任務名稱}.conf
2)輸入任務的配置信息(注意,此處差異較大)
#示例如下(重點關注{}中的內容)
#a1是要啟動的agent的名字
a1.sources = r1 #命名agent的sources為r1
a1.sinks = k1 #命名agent的sinks為k1
a1.channels = c1 #命名agent的channels為c1
# TaildirSource配置
a1.sources.r1.type = org.apache.flume.source.taildir.TaildirSource
a1.sources.r1.channels = memory_channel
a1.sources.r1.positionFile = /tmp/taildir_position.json
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = {/usr/logfile/s51/mylog/*}
a1.sources.r1.batchSize = 100
a1.sources.r1.backoffSleepIncrement = 1000
a1.sources.r1.maxBackoffSleep = 5000
a1.sources.r1.recursiveDirectorySearch = true
# Describe/configure the source
a1.sources.r1.type = exec #指定r1的類型為exec
a1.sources.r1.command =cat {日誌文件的位置} #寫入本地文件路徑
# Describe the sink
a1.sinks.k1.type = com.aliyun.datahub.flume.sink.DatahubSink #指定k1的類型
a1.sinks.k1.datahub.accessID ={ accessID }
a1.sinks.k1.datahub.accessKey ={ accessKey }
a1.sinks.k1.datahub.endPoint = http://dh-cn-hangzhou.aliyuncs.com
a1.sinks.k1.datahub.project = {datahub_project_name}
a1.sinks.k1.datahub.topic ={datahub_ topic _name}
a1.sinks.k1.batchSize = 100 #一次寫入文件條數
a1.sinks.k1.serializer = DELIMITED
a1.sinks.k1.serializer.delimiter = {欄位間隔符}
a1.sinks.k1.serializer.fieldnames= {欄位 「,」 隔開,注意需要與日誌文件的順序、datahub topic的順序保持一致}
a1.sinks.k1.serializer.charset = {文字編碼格式}
a1.sinks.k1.shard.number = {分片數,需要與datahub 的topic配置一致}
a1.sinks.k1.shard.maxTimeOut = 60
# Use a channel which buffers events in memory
a1.channels.c1.type = memory #指定channel的類型為memory
a1.channels.c1.capacity = 1000 #設置channel的最大存儲數量為1000
a1.channels.c1.transactionCapacity = 1000 #每次最大可從source中拿到或送到sink中的event數量是1000
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3)檢查無誤後,啟動flume日誌採集agent;
bin/flume-ng agent -n a1 -c conf -f conf/ {任務名稱}
.conf -Dflume.root.logger=INFO,console
2、flume 1.6
原生不支持TaildirSource,需要自行下載集成:
下載地址:http://7xipth.com1.z0.glb.clouddn.com/flume-taildirfile-source.zip
將源碼單獨編譯,打成jar包,上傳到$FLUME_HOME/lib/目錄下,之後配置方法可以參考上文;
3、常見問題:
- 日誌文件解析錯誤
? 異常信息截圖:
? 原因分析及解決方法
出現圖示異常的原因,一般是因為解析日誌文件得到的屬性數量和配置文件不一致所致,此時需要重點排查:
1) 配置文件的間隔符、屬性是否正確
a1.sinks.k1.serializer.delimiter = {欄位間隔符}
a1.sinks.k1.serializer.fieldnames= {欄位 「,」 隔開,注意需要與日誌文件的順序、datahub topic的順序保持一致}
a1.sinks.k1.serializer.charset = {文字編碼格式}
2) 日誌文件格式是否符合預期、是否包含特殊字元
- 文件適配符模式下,找不到文件
? 異常信息截圖:
? 原因分析及解決方法
出現圖示異常的原因,一般是因為按照通配符設置,未找到文件導致異常退出,此時需要重點檢查配置文件中的日誌路徑設置:
a1.sources.r1.filegroups.f1 = {/usr/logfile/s51/mylog/*}
3、 修改配置文件後,重新啟動,無異常信息但是不載入數據
? 異常信息截圖:
? 原因分析及解決方法
該問題比較隱秘,任務可以啟動,沒有明顯的異常日誌,但是到sink環節後不再載入數據,一般是因為修改了配置文件設置,但是沒有刪除對應的描述文件,需要:
1) 找到配置的描述文件路徑
a1.sources.r1.positionFile = /tmp/taildir_position.json
2) 刪除描述文件,重啟任務
可正常載入數據;
三、擴展場景的產品架構&數據流
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
推薦閱讀:
※扯個關於大數據的淡
※中華財寶:珠寶行業在大數據時代該如何前行?
※大數據計數原理1+0=1這你都不會算(三)No.51
※美國現代藝術博物館的軟數據:111件服裝展品的前世今生
※如何成為大數據產品經理