大数据系列之知识点总结和企业级游戏行业架构设计
文章目錄
- 導言
- 1 游戲行業數據分析流程以及分析指標
- 1.1 數據來源
- 1.2 數據收集和落地
- 1.3 離線分析
- 1.4 實時數據分析
- 1.5 用戶肖像
- 2 大數據相關知識
- 2.1 離線數據統計技能相關要求
- 2.1.1 Hadoop
- 2.1.2 Hive
- 2.1.3 HBase
- 2.1.4 Spark Core
- 2.1.5 Spark SQL
- 2.2 實時數據統計技能相關要求
- 2.2.1 KafKa
- 2.2.2 Flume
- 2.2.3 Flink
- 2.2.4 Spark Streaming
- 2.3 其他技能要求
- 2.3.1 Redis
- 2.3.2 Mysql
- 2.3.3 MongoDB
- 2.3.4 ElasticSearch
- 2.3.5 常見排序方法
- 2.3.6 常見設計模式
- 3 常見典型案例
- 3.1 Hadoop編程
- 3.2 Flink編程
- 3.3 Spark SQL編程
- 3.4 Redis編程
- 4 大數據企業級架構設計
- 4.1 架構設計
- 4.2 數據收集
- 4.2.1 創建kafka的topic
- 4.2.2 配置Flume腳本(自定義攔截器將Kafka數據存儲到S3)
- 4.2.3 啟動Flume
- 4.2.4 S3存儲數據分類效果概覽
- 4.2.5 150w日活每天產生數據大小
- 4.3 離線數據分析
- 4.3.1 Hive表的創建
- 4.3.2 自定義UDF函數天周月起始時間
- 4.3.3 Hive加載分區腳本
- 4.3.4 Hive定時任務腳本
- 4.3.5 Zeppelin整合Spark和Hive
- 4.3.6 Spark作業日志
- 4.4 實時數據分析
- 4.4.1 Flink的WebUI
- 4.4.2 Flink統計每小時內購總數并寫到ES
- 4.5 大數據集群監測
導言
此文獻給正在大學迷茫或者即將進入大學計算機專業,將來想要從事大數據行業的學弟學妹們。學長給你們的建議在大學期間踏踏實實學習知識,不要好高騖遠;多參加體育鍛煉。做好這兩點便可。切記不要往多領域發展,最終你會發現:仿佛這你也會那你也會,其實啥也不精還容易鬧笑話。目前大數據有很多職位如:Hadoop開發工程師、Spark開發工程師、Flink開發工程師、數倉ETL、數據挖掘、數據分析、機器學習等職位,將來自己想要從事哪一個工種,應該根據自身條件去抉擇和判斷。本文主要列舉一些大數據開發工程師所需要掌握的知識點和大數據在游戲行業的常規應用,可以帶你簡單的認知一下大數據這個行業。
1 游戲行業數據分析流程以及分析指標
1.1 數據來源
- WEB服務器日志如:Tomcat,Nginx。
- 游戲打點記錄。
1.2 數據收集和落地
-
Nginx日志 + HDFS或S3。
-
Kafka+ Flume+ HDFS或S3 進行輸入與輸出。
1.3 離線分析
過濾清洗數據Nginx請求日志,ETL工作:
- 統計每日請求量。
- 統計哪一時段為用戶活躍期。
- 統計響應請求數量和未能響應的數量。
游戲打點記錄業務邏輯:
-
統計每日新增,新增留存。
-
統計每日活躍人數維度如:平臺(安卓/IOS),國家,終端(華為/iPhone)。
-
休閑類游戲如有關卡,統計關卡通關率。
-
統計廣告點擊率。
-
游戲中價值替代物如鉆石或者金幣,統計其產出和消耗。
-
統計出游戲中作弊用戶。
-
統計分析各種活動的利益價值。
-
統計內購數量。
-
統計游戲玩家啟動次數,玩游戲的時長。
1.4 實時數據分析
-
實時統計每小時內新增用戶,活躍用戶。
-
實時統計每小時內購數量。
1.5 用戶肖像
批處理+實時處理統計每個用戶肖像:
-
基礎信息如:性別,國家,年齡,婚否,是否有車房。
-
購買能力:根據消費金額和頻率進行評估過。
-
是否作弊:是否是破解包。
-
廣告用戶:看廣告頻率多,不進行內購。
-
玩家分類:頻繁,經常,常常,一般,偶爾。
-
玩家等級:高,較高,中上,中,較低,低。
2 大數據相關知識
2.1 離線數據統計技能相關要求
2.1.1 Hadoop
-
要求熟練掌握Hadoop讀寫流程;
-
要求熟練掌握MapReduce作業流程;
-
要求熟練掌握Job提交流程以及源碼;
-
要求熟練掌握Map Task和Reduce Task流程;
-
要求熟練掌握YARN運行原理;
-
要求掌握小文件優化,小表JOIN大表優化方案;
-
要求掌握Job串行流程以及TOPN實現方案;
-
要求熟練掌握ETL;
2.1.2 Hive
-
要求熟練掌握內部表、外部表、分區表的創建;
-
要求熟練掌握分區和分桶的區別;
-
要求熟練掌握數據的導入導出;
-
要求熟練掌握行轉列和列轉行的使用場景;
-
要求熟練掌握窗口函數;
-
要求熟練掌握Rank函數進行排名;
-
要求熟練掌握自定義UDF和UDTF;
-
要求熟練掌握文件存儲格式以及區別;
-
要求熟練掌握調優案例:小表和大表JOIN、大表JOIN大表、MapJoin、合理設置Map數量、小文件合并、合理Reduce數、JVM重用等;
2.1.3 HBase
-
要求熟練掌握HBase讀寫流程;
-
要求熟練掌握HBase的Memstore Flush;
-
要求熟練掌握HBase的文件合并StoreFile Compaction;
-
要求熟練掌握HBase的Region拆分流程;
-
要求熟練掌握HBase的API;
-
要求熟練掌握HBase的優化如:預分區;RowKey設計、內存優化、優化 HStore 文件大小、優化 HBase 客戶端緩存、flush,compact,split 機制等;
2.1.4 Spark Core
-
要求熟練掌握Spark通信架構;
-
理解Spark DAG有向無循環圖的設計思想;
-
要求掌握Spark各個節點啟動流程;
-
要求掌握Spark的Job提交和Task的拆分;
-
要求掌握Spark Shuffle過程;
-
要求掌握Spark三種部署模式的區別;
-
要求掌握 Transform和Action算子;
-
要求掌握groupByKey和reduceByKey的區別;
-
要求熟練編寫wordCount程序;
2.1.5 Spark SQL
-
要求掌握RDD、DataFrames、DataSet三者的關系;
-
要求掌握自定義UDF函數和自定義聚合函數;
-
要求掌握數據的輸入與輸出;
-
要求掌握優化方案;
2.2 實時數據統計技能相關要求
2.2.1 KafKa
- 要求掌握Topic的創建查詢刪除命令;
- 要求掌握Kafka的存儲機制及高效讀寫的原理;
- 要求掌握Kafka生產者:分區原因及原則、ISR機制、故障處理細節、Exactly Once精準一次性;
- 要求掌握Kafka消費者:push和pull區別和場景、分區分配策略RoundRobin和Range、offest的維護、重新消費等。
- 要求了解Producer事務和Consumer事務;
- 要求掌握Kafka自定義攔截器;
- 熟練掌握Kafka數據積壓處理方法;
- 要求了解kafka如何保證順序發送;
- 要求了解會使用Kafka監控插件Kafka Eagle;
2.2.2 Flume
-
要求掌握Flume組成架構Source、Channel、Sink;
-
要求掌握Flume Agent內部原理;
-
要求熟練編寫攔截器;
-
要求掌握Flume整合Kafka和Hdfs;
-
要求了解數據流監控如:Ganglia;
2.2.3 Flink
-
要求理解Flink特性:時間驅動型、流與批的世界觀、分層Api;
-
要求掌握Standalone模式和YARN模式;
-
要求掌握作業管理器(JobManager)、資源管理器(ResourceManager)、任務管理器(TaskManager)、分發器(Dispatcher)它們之間的關系;
-
要求掌握任務提交流程和任務調度原理;
-
要求理解TaskManger和Slots之間的關系;
-
要求掌握Source的類型, 流的合并和側輸出流;
-
要求掌握Transform算子,常見聚合算子;
-
要求掌握滾動窗口、滑動窗口、會話窗口;
-
要求掌握時間語義和Wartermak; Flink底層8個ProcessFunction:ProcessFunction, KeyedProcessFunction ,CoProcessFunction, ProcessJoinFunction ,BroadcastProcessFunction ,KeyedBroadcastProcessFunction ,ProcessWindowFunction, ProcessAllWindowFunction
-
要求掌握Sink的輸出類型;
-
要求掌握狀態編程;
-
要求掌握檢查點checkPoint的原理;
-
要求掌握Flink+Kafka實現端到端的exactly-once;
2.2.4 Spark Streaming
-
要求掌握Spark Streaming消費Kafka的偏移量是如何維護的;
-
要求掌握Spark Streaming讀取Kafka數據的兩種方式;
-
要求掌握Spark Streaming讀取kafka數據時如何保證數據不丟失問題,至多,至少,精準一次語義;
-
要求理解updateStateByKey底層是如何實現保存數據原來的狀態;
-
要求掌握窗口函數;
-
要求熟練編寫WordCount程序;
2.3 其他技能要求
2.3.1 Redis
-
要求掌握String、Hash 、List、Set、 Sorte Set操作;
-
要求掌握并理解Redis哨兵模式;
-
要求掌握RDB和AOF的區別;
-
要求理解并運用Redis實現游戲周榜、月榜;
-
要求理解并運用Redis鎖實現高并發;
2.3.2 Mysql
-
要求理解Mysql存儲引擎InnoDB、MyISAM的區別;
-
要求熟練掌握索引創建和索引失效的情況;
-
要求了解Mysql讀寫分離;
-
要求掌握Mysql存儲機制;
-
要求理解并運用實現高并發鎖;
2.3.3 MongoDB
-
要求理解MongoDB存儲結構;
-
要求熟練掌握集合的創建、刪除、導入導出操作;
-
要求熟練掌握數據的備份與恢復;
-
要求熟練掌握索引的創建;
2.3.4 ElasticSearch
-
要求掌握文檔的創建刪除查詢聚合操作;
-
要求會使用elasticsearch-head;
-
要求掌握和Kibana聯合使用,繪制條形、折線,餅狀統計圖;
2.3.5 常見排序方法
-
要求熟練掌握冒泡排序;
-
要求熟練掌握快排;
-
要求熟練掌握選擇排序;
-
要求熟練掌握插入排序;
-
要求熟練掌握歸并排序;
2.3.6 常見設計模式
-
要求熟練掌握單例模式;
-
要求熟練掌握觀察者模式;
-
要求熟練掌握工廠模式;
-
要求熟練掌握代理模式;
3 常見典型案例
3.1 Hadoop編程
假設下面是一部分nginx請求日志經過數據清洗后的數據。固定格式為:(用戶ID IP 日期 請求URI 請求地址 請求狀態 請求Agent)
e4ec9bb6f2703eb7 180.21.76.203 2020-06-30T09:11:14+00:00 /u3d/v2/appconfig 127.0.0.1:8080 200 “BestHTTP”
1f85152896978527 171.43.190.8 2020-06-30T09:11:14+00:00 /u3d/v2/userAction 127.0.0.1:8080 200 “BestHTTP”
要求:
-
統計每天的日活躍人數;
-
統計每小時的活躍人數;
-
統計每小時請求URL排名前十名;
-
統計出國家|省每日活躍數;
-
根據User Agent統計每日終端信息
3.2 Flink編程
假設有下面是一部分用戶登錄狀態的日志。固定格式為:(用戶ID IP 請求狀態 時間)
e4ec9bb6f2703eb7 180.21.76.203 success 1558430815
1f85152896978527 171.43.190.8 fail 1558430826
要求:
-
使用狀態編程輸出5秒內連續登錄失敗超過3次的用戶;
-
使用CEP輸出5秒內連續登錄失敗超過3次的用戶;
3.3 Spark SQL編程
假設有兩張表new_users每天大約6M和play_stages表每天大約10G數據。兩張表都包含以下字段:
userID 用戶ID appName 游戲名稱 appVersion 游戲版本 appPlatform 平臺安卓|IOS
要求: 統計新增用戶留存1-7,15,30,90這10天的留存率;
3.4 Redis編程
假設一個游戲有2000W用戶,每天DAU大約100W左右,現在要求根據關卡值做一個游戲排行榜 ,你會如何設計?
4 大數據企業級架構設計
4.1 架構設計
4.2 數據收集
客戶端發送日志到接口,將數據發送到kafka消息中間件, flume將kafka作為source寫入到亞馬遜s3。4.2.1 創建kafka的topic
kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic topic-s3-diamond kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic topic-s3-ads kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic topic-s3-launch kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic topic-s3-stage kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic topic-s3-gift kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic topic-s3-shop kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic topic-s3-prop kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic topic-s3-ball kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic topic-s3-airdrop4.2.2 配置Flume腳本(自定義攔截器將Kafka數據存儲到S3)
a1.sources=r1 a1.channels=c1 a1.sinks=k1 a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = com.pusidun.applogs.flume.interceptor.S3CollInterceptor$Builder a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource a1.sources.r1.batchSize = 5000 a1.sources.r1.batchDurationMillis = 2000 a1.sources.r1.kafka.bootstrap.servers = localhost:9092 a1.sources.r1.kafka.zookeeperConnect = localhost:2181 a1.sources.r1.kafka.topics.regex = ^topic-s3-.*$ a1.channels.c1.type=memory a1.channels.c1.capacity=100000 a1.channels.c1.transactionCapacity=10000 a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = s3a://bricks-playable/logs/%{logType}/%Y%m/%d a1.sinks.k1.hdfs.filePrefix = events- a1.sinks.k1.hdfs.rollInterval = 600 a1.sinks.k1.hdfs.rollSize = 0 a1.sinks.k1.hdfs.rollCount = 0 a1.sinks.k1.hdfs.fileType = DataStream a1.sources.r1.channels = c1 a1.sinks.k1.channel= c14.2.3 啟動Flume
nohup bin/flume-ng agent \ -c conf \ -n a1 \ -f conf/s3.conf & \ -Dflume.root.logger=DEBUG,console &4.2.4 S3存儲數據分類效果概覽
4.2.5 150w日活每天產生數據大小
| ads | 2.8G | iOS用戶廣告行為 |
| diamond | 2G | iOS鉆石產出與消耗數據 |
| diamondShop | 30M | 鉆石商店頁面 |
| dingyue | 7KB | 訂閱消息 |
| gift | 1.2G | 禮物盒子消息 |
| launch | 650M | 游戲啟動上報數據 |
| prop | 500M | 游戲道具產出消耗 |
| shopWindow | 60M | 彈窗消息 |
| stage | 10G | 關卡信息 |
| airdrop | 400M | 空頭包 |
| ball | 900KB | 球皮膚 |
| bussiness | 17G | 安卓商業廣告消息 |
| appsflyer | 18.7G | 安卓用戶廣告消息 |
| nginx-logs | 5G | WEB端請求日志 |
4.3 離線數據分析
Hive On Spark進行離線數據分析。4.3.1 Hive表的創建
# 創建Hive外部表 # s3_stage | s3_launch | s3_ads | s3_diamond | s3_diamondShop | s3_gift | s3_airdrop | s3_prop | s3_ball|s3_shopWindow CREATE EXTERNAL TABLE 表名( uid STRING, appVersion STRING, appName STRING, appPlatform STRING, ip STRING, countryCode STRING, systimestamp BIGINT, currentTime BIGINT, clientTimeStamp STRING, groupId STRING, kindType STRING, params Map<STRING,STRING> )PARTITIONED BY (ym string, day string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' STORED AS TEXTFILE;4.3.2 自定義UDF函數天周月起始時間
#添加編寫的jar ADD JAR /opt/apache/hive-3.1.2/lib/app-logs-hive-udf.jar #注冊UDF自定義函數 天周月起始時間 CREATE FUNCTION getdaybegin AS 'com.pusidun.applogs.udf.hive.DayBeginUDF'; CREATE FUNCTION getweekbegin AS 'com.pusidun.applogs.udf.hive.WeekBeginUDF'; CREATE FUNCTION getmonthbegin AS 'com.pusidun.applogs.udf.hive.MonthBeginUDF'; CREATE FUNCTION formattime AS 'com.pusidun.applogs.udf.hive.FormatTimeUDF';4.3.3 Hive加載分區腳本
vim .exportData.sql ALTER TABLE s3_stage ADD PARTITION(ym='${ym}',day='${day}') LOCATION 's3a://bricks-playable/logs/stage/${ym}/${day}/'; ALTER TABLE s3_launch ADD PARTITION(ym='${ym}',day='${day}') LOCATION 's3a://bricks-playable/logs/launch/${ym}/${day}/'; ALTER TABLE s3_ads ADD PARTITION(ym='${ym}',day='${day}') LOCATION 's3a://bricks-playable/logs/ads/${ym}/${day}/'; ALTER TABLE s3_diamond ADD PARTITION(ym='${ym}',day='${day}') LOCATION 's3a://bricks-playable/logs/diamond/${ym}/${day}/'; ALTER TABLE s3_gift ADD PARTITION(ym='${ym}',day='${day}') LOCATION 's3a://bricks-playable/logs/gift/${ym}/${day}/'; ALTER TABLE s3_airdrop ADD PARTITION(ym='${ym}',day='${day}') LOCATION 's3a://bricks-playable/logs/airdrop/${ym}/${day}/'; ALTER TABLE s3_prop ADD PARTITION(ym='${ym}',day='${day}') LOCATION 's3a://bricks-playable/logs/prop/${ym}/${day}/'; ALTER TABLE s3_ball ADD PARTITION(ym='${ym}',day='${day}') LOCATION 's3a://bricks-playable/logs/ball/${ym}/${day}/';4.3.4 Hive定時任務腳本
vim hive-exec.sh #!/bin/bash systime=`date -d "1 day ago" +%Y%m-%d` ym=`echo ${systime} | awk -F '-' '{print $1}'` day=`echo ${systime} | awk -F '-' '{print $2}'` cp /opt/s3/.exportData.sql /opt/s3/exportData.sql sed -i 's/${ym}/'${ym}'/g' /opt/s3/exportData.sql sed -i 's/${day}/'${day}'/g' /opt/s3/exportData.sql4.3.5 Zeppelin整合Spark和Hive
4.3.6 Spark作業日志
4.4 實時數據分析
Fink消費kafka數據統計每1小時內購總額并寫入ES、每小時url請求Top10、每小時日活人數。4.4.1 Flink的WebUI
4.4.2 Flink統計每小時內購總數并寫到ES
4.5 大數據集群監測
總結
以上是生活随笔為你收集整理的大数据系列之知识点总结和企业级游戏行业架构设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TSP问题(贪心法)最近邻点和最短连接
- 下一篇: visual assistant x 破