文/曾志浩

圍繞王者榮耀大數(shù)據(jù)運營,依托對局日志和好友關(guān)系,開展了王者周報、賽季總結(jié)和周年慶活動等項目。這些案例中,遇到了哪些挑戰(zhàn)?每一個指標是如何計算的呢?

作者:曾志浩,騰訊微信游戲中心,數(shù)據(jù)分析工程師,專注于手游數(shù)據(jù)分析與挖掘,微信游戲中心用戶畫像、內(nèi)容推薦等工作。

1. 整體框架

從數(shù)據(jù)開發(fā)的角度,此類運營項目主要會和策劃同學(xué)、后臺同學(xué)進行協(xié)作。前期工作主要是整理數(shù)據(jù)源、拆解數(shù)據(jù)指標,本文主要專注大數(shù)據(jù)計算過程,最后一步將結(jié)果同步給后臺??蚣苋鐖D所示。

181134s5qqu5d5pp3zs9ex.png
關(guān)鍵的執(zhí)行是 cg.mapValues,還有后面一步的 flatMapValues,運行的日志顯示并行度和 other 關(guān)系緊密。當A join B 時,對 B 進行合理的 hashPartition,可以提升運行效率。經(jīng)過測試, join算子性能強勁:不發(fā)生數(shù)據(jù)傾斜的前提,可以快速完成十億級和十億級的 RDD 進行關(guān)聯(lián)。補充一點題外話,順藤摸瓜看一下其他核心算子:distinct -> reduceByKey -> combineByKey。所以 Spark 的 distinct算子不會導(dǎo)致數(shù)據(jù)傾斜。

181238xssxxwaoo9a7lqox.png
分治法

業(yè)務(wù)背景:周年慶,計算用戶一年內(nèi)的最高連勝、連敗,一年內(nèi)開黑最多的好友。

將一年的對局日志全部讀入內(nèi)存?考慮到王者的體量,打消了這個想法。分治法也許是突破口:先把每個月的對局日志合并計算,然后對12個月的中間結(jié)果再做一次合并。圖示如下,每天的日志評估量級是2.5E,月活用戶評估量級是1.2E,這個規(guī)模可以輕松應(yīng)對。

180654h0jmz2pdylyfyfjg.png
此次,x._1, x._2 可讀性、維護性很糟糕,業(yè)務(wù)中有一些同學(xué)寫了大量此類Magic 代碼,異常頭疼。王者周報超過50個數(shù)據(jù)項,開發(fā)過程中指標變化、增刪都是常事,所以將用戶的數(shù)據(jù)指標封裝在 UsrSimpleInfo 類。示例如下。

181455u09qrtz02q7xpqyz.png
reduce 的寫法如下。

180655helfslxtqrpwefft.png
封裝取最大/最小的指標

業(yè)務(wù)背景:1. 用戶最常用英雄的表現(xiàn),2. 在一段時間里,用戶最新的游戲昵稱。

用戶在指標A 最大時的其他數(shù)據(jù)項, Hive-SQL 需要先求用戶指標A的最大值,然后再join 原始表,實現(xiàn)方式比較笨重。

類似前面的做法,把上述邏輯進行對象封裝和函數(shù)重載:

180655u5r227plj9pe2bj6.png
避免改變RDD的核心數(shù)據(jù)結(jié)構(gòu)

業(yè)務(wù)背景:用戶每個對局模式的對局場次,每個英雄的使用場次和表現(xiàn)。

粗暴方法如下。

180655rzhmrmrerymrrgbe.png
兩個 map算子 都會對全量對局日志進行 transform,內(nèi)存開銷極大。Key-Value結(jié)構(gòu)的RDD,修改Value是正常的,但是應(yīng)該避免改變 Key。突破點在于:對局模式和英雄數(shù)枚舉下來是比較少的,適合HashMap存儲;最后reduceByKey 階段做 Foldleft 合并數(shù)據(jù)。示例如下。

180655e3n82wzzh33tikht.png
穩(wěn)健地運行

產(chǎn)品發(fā)布之后,我發(fā)現(xiàn)“維穩(wěn)”的壓力很大。調(diào)試和運行的過程中,遇到了不少挑戰(zhàn)。列舉幾個關(guān)鍵的節(jié)點。
?

  • 入庫日志校驗和依賴。

?

  • 運行監(jiān)控。

Spark 任務(wù)的調(diào)度機制、內(nèi)存分配,需要考慮多個影響因素。從 Spark UI 頁面中,可以跟蹤很多有價值的信息。任務(wù)根據(jù) Action操作,劃分到 Jobs,然后再進一步到 Stages。重點關(guān)注Stages階段真實的執(zhí)行順序!Executors 顯示了driver 節(jié)點和 data 節(jié)點的運行時信息。

?

?

  • 超時告警和錯誤告警。

4. 提升效果

運行耗時其實不適合作為評估指標,僅做參考。不考慮分配的內(nèi)存/CPU資源,還有計算集群負載,都是耍流氓。

下面寫的運行耗時,不包含準備數(shù)據(jù),強調(diào)的是目前計算花費的時間和日志吞吐量,應(yīng)對產(chǎn)品運營節(jié)奏不再是瓶頸。上一節(jié)提到的方法,通常會綜合應(yīng)用、隨機應(yīng)變。

?

?

  • 優(yōu)化:join算子調(diào)優(yōu);將面向過程的計算封裝成對象;避免改變RDD的核心數(shù)據(jù)結(jié)構(gòu)。 王者周報涉及十億級別的上報日志(包括5v5、3v3、1v1對局、英雄熟練度等)和龐大的關(guān)系鏈,計算耗時2.5小時-3小時。

?

  • 優(yōu)化:將面向過程的計算封裝成對象。 賽季總結(jié)的各項基礎(chǔ)指標,只需要3-4小時完成。賽季結(jié)束的次日,通常可以體驗/發(fā)布賽季總結(jié)。

?

  • 優(yōu)化: 分治法。 周年慶: 在王者榮耀用戶體量和活躍度下,基于一年的對局日志計算了最大連勝、連敗和開黑最多的好友。

?

  • 優(yōu)化:剪枝原始日志數(shù)據(jù)。 計算一個賽季的兩兩開黑情況,耗時50分鐘。

5. 從產(chǎn)品角度解析王者數(shù)據(jù)運營

相比羅列數(shù)據(jù)指標,不如將數(shù)據(jù)包裝成概念。數(shù)據(jù)不在于多、不在于奇,而在于“情”。

180656db75y7l2d84572d7.jpg [ 左一成績單羅列數(shù)據(jù),新版包裝成每周一字 ]
呈現(xiàn)用戶個人的數(shù)據(jù)僅是初級層次,如何連接好友,需要更多的想象。

王者大數(shù)據(jù)運營,在資源轉(zhuǎn)化、曝光用戶數(shù)、游戲用戶的滲透,分享量、來著分享的訪問,以及最常規(guī)的拉新、拉回流分析上,都具有上佳的表現(xiàn)。


via:騰訊大講堂


銳亞教育

銳亞教育,游戲開發(fā)論壇|游戲制作人|游戲策劃|游戲開發(fā)|獨立游戲|游戲產(chǎn)業(yè)|游戲研發(fā)|游戲運營| unity|unity3d|unity3d官網(wǎng)|unity3d 教程|金融帝國3|8k8k8k|mcafee8.5i|游戲蠻牛|蠻牛 unity|蠻牛