此文獻給正在大學迷茫或者即将進入大學計算機專業,将來想要從事大數據行業的學弟學妹們。學長給你們的建議在大學期間踏踏實實學習知識,不要好高骛遠;多參加體育鍛煉。做好這兩點便可。切記不要往多領域發展,最終你會發現:仿佛這你也會那你也會,其實啥也不精還容易鬧笑話。
1 遊戲行業數據分析流程以及分析指标1.1 數據來源- WEB服務器日志如:Tomcat,Nginx。
- 遊戲打點記錄。
- Nginx日志 hdfs或S3。
- Kafka flume HDFS或S3 進行輸入與輸出。
過濾清洗數據Nginx請求日志,ETL工作:
- 統計每日請求量。
- 統計哪一時段為用戶活躍期。
- 統計響應請求數量和未能響應的數量。
遊戲打點記錄業務邏輯:
- 統計每日新增,新增留存。
- 統計每日活躍人數維度如:平台(安卓/IOS),國家,終端(華為/iPhone)。
- 休閑類遊戲如有關卡,統計關卡通關率。
- 統計廣告點擊率。
- 遊戲中價值替代物如鑽石或者金币,統計其産出和消耗。
- 統計出遊戲中作弊用戶。
- 統計分析各種活動的利益價值。
- 統計内購數量。
- 統計遊戲玩家啟動次數,玩遊戲的時長。
- 實時統計每小時内新增用戶,活躍用戶。
- 實時統計每小時内購數量。
批處理 實時處理統計每個用戶肖像:
- 基礎信息如:性别,國家,年齡,婚否,是否有車房。
- 購買能力:根據消費金額和頻率進行評估過。
- 是否作弊:是否是破解包。
- 廣告用戶:看廣告頻率多,不進行内購。
- 玩家分類:頻繁,經常,常常,一般,偶爾。
- 玩家等級:高,較高,中上,中,較低,低。
- 要求熟練掌握Hadoop讀寫流程;
- 要求熟練掌握MapReduce作業流程;
- 要求熟練掌握Job提交流程以及源碼;
- 要求熟練掌握Map Task和Reduce Task流程;
- 要求熟練掌握YARN運行原理;
- 要求掌握小文件優化,小表JOIN大表優化方案;
- 要求掌握Job串行流程以及TOPN實現方案;
- 要求熟練掌握ETL;
- 要求熟練掌握内部表、外部表、分區表的創建;
- 要求熟練掌握分區和分桶的區别;
- 要求熟練掌握數據的導入導出;
- 要求熟練掌握行轉列和列轉行的使用場景;
- 要求熟練掌握窗口函數;
- 要求熟練掌握Rank函數進行排名;
- 要求熟練掌握自定義UDF和UDTF;
- 要求熟練掌握文件存儲格式以及區别;
- 要求熟練掌握調優案例:小表和大表JOIN、大表JOIN大表、MapJoin、合理設置Map數量、小文件合并、合理Reduce數、JVM重用等;
- 要求熟練掌握HBase讀寫流程;
- 要求熟練掌握HBase的Memstore Flush;
- 要求熟練掌握HBase的文件合并StoreFile Compaction;
- 要求熟練掌握HBase的Region拆分流程;
- 要求熟練掌握HBase的API;
- 要求熟練掌握HBase的優化如:預分區;RowKey設計、内存優化、優化 HStore 文件大小、優化 HBase 客戶端緩存、flush,compact,split 機制等;
- 要求熟練掌握Spark通信架構;
- 理解Spark DAG有向無循環圖的設計思想;
- 要求掌握Spark各個節點啟動流程;
- 要求掌握Spark的Job提交和Task的拆分;
- 要求掌握Spark Shuffle過程;
- 要求掌握Spark三種部署模式的區别;
- 要求掌握 Transform和Action算子;
- 要求掌握groupByKey和reduceByKey的區别;
- 要求熟練編寫wordCount程序;
- 要求掌握RDD、DataFrames、DataSet三者的關系;
- 要求掌握自定義UDF函數和自定義聚合函數;
- 要求掌握數據的輸入與輸出;
- 要求掌握優化方案;
- 要求掌握Topic的創建查詢删除命令;
- 要求掌握Kafka的存儲機制及高效讀寫的原理;
- 要求掌握Kafka生産者:分區原因及原則、ISR機制、故障處理細節、Exactly Once精準一次性;
- 要求掌握Kafka消費者:push和pull區别和場景、分區分配策略RoundRobin和Range、offest的維護、重新消費等。
- 要求了解Producer事務和Consumer事務;
- 要求掌握Kafka自定義攔截器;
- 熟練掌握Kafka數據積壓處理方法;
- 要求了解kafka如何保證順序發送;
- 要求了解會使用Kafka監控插件Kafka Eagle;
- 要求掌握Flume組成架構Source、Channel、Sink;
- 要求掌握Flume Agent内部原理;
- 要求熟練編寫攔截器;
- 要求掌握Flume整合Kafka和Hdfs;
- 要求了解數據流監控如:Ganglia;
- 要求理解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;
- 要求掌握Spark Streaming消費Kafka的偏移量是如何維護的;
- 要求掌握Spark Streaming讀取Kafka數據的兩種方式;
- 要求掌握Spark Streaming讀取Kafka數據時如何保證數據不丢失問題,至多,至少,精準一次語義;
- 要求理解updateStateByKey底層是如何實現保存數據原來的狀态;
- 要求掌握Spark Streaming的窗口函數;
- 要求熟練編寫WordCount程序;
- 要求掌握String、Hash 、List、Set、 Sorte Set操作;
- 要求掌握并理解Redis哨兵模式;
- 要求掌握RDB和AOF的區别;
- 要求理解并運用Redis實現遊戲周榜、月榜;
- 要求理解并運用Redis鎖實現高并發;
- 要求理解Mysql存儲引擎InnoDB、MyISAM的區别;
- 要求熟練掌握索引創建和索引失效的情況;
- 要求了解Mysql讀寫分離;
- 要求掌握Mysql存儲機制;
- 要求理解并運用實現高并發鎖;
- 要求理解MongoDB存儲結構;
- 要求熟練掌握集合的創建、删除、導入導出操作;
- 要求熟練掌握數據的備份與恢複;
- 要求熟練掌握索引的創建;
- 要求掌握文檔的創建删除查詢聚合操作;
- 會使用elasticsearch-head;
- 要求掌握和Kibana聯合使用,繪制條形、折線,餅狀統計圖;
- 要求熟練掌握冒泡排序;
- 要求熟練掌握快排;
- 要求熟練掌握選擇排序;
- 要求熟練掌握插入排序;
- 要求熟練掌握歸并排序;
- 要求熟練掌握單例模式;
- 要求熟練掌握觀察者模式;
- 要求熟練掌握工廠模式;
- 要求熟練掌握代理模式
假設下面是一部分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統計每日終端信息;
假設下面是一部分用戶登錄狀态的日志。固定格式為:(用戶ID IP 請求狀态 時間)
e4ec9bb6f2703eb7 180.21.76.203 success 1558430815
1f85152896978527 171.43.190.8 fail 1558430826
要求:
- 使用狀态編程輸出5秒内連續登錄失敗超過3次的用戶;
- 使用CEP輸出5秒内連續登錄失敗超過3次的用戶;
假設有兩張表new_users每天大約6M和play_stages表每天大約10G數據。兩張表都包含以下字段:UserID 用戶ID ,appName遊戲名稱, appVersion 遊戲版本, appPlatform 安卓或IOS
要求: 統計新增用戶留存1-7,15,30,90這10天的留存率;
3.4 Redis編程假設一個遊戲有2000W用戶,每天DAU大約150W左右,現在要求根據關卡值做一個遊戲排行榜 你會如何設計?
4 大數據企業級架構設計4.1 架構設計
架構設計圖.png
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-airdrop
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= c1
nohup bin/flume-ng agent \
-c conf \
-n a1 \
-f conf/s3.conf & \
-Dflume.root.logger=DEBUG,console &
s3.png
4.2.5 150w日活每天産生數據大小
data.png
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;
#添加編寫的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';
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}/';
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.sql
zeppelin.png
4.3.6 Spark作業日志
spark-history-jobs.png
4.4 實時數據分析Fink消費kafka數據統計每1小時内購總額并寫入ES、每小時url請求Top10、每小時日活人數。
4.4.1 Flink的WebUI
flink-job.png
4.4.2 Flink統計每小時内購總數并寫到ES
es.png
4.5 大數據集群監測
cloudera-manager.png
,