游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)
此文献给正在大学迷茫或者即将进入大学计算机专业,将来想要从事大数据行业的学弟学妹们。学长给你们的建议在大学期间踏踏实实学习知识,不要好高骛远;多参加体育锻炼。做好这两点便可。切记不要往多领域发展,最终你会发现:仿佛这你也会那你也会,其实啥也不精还容易闹笑话。
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
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com