游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)

此文献给正在大学迷茫或者即将进入大学计算机专业,将来想要从事大数据行业的学弟学妹们。学长给你们的建议在大学期间踏踏实实学习知识,不要好高骛远;多参加体育锻炼。做好这两点便可。切记不要往多领域发展,最终你会发现:仿佛这你也会那你也会,其实啥也不精还容易闹笑话。

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底层是如何实现保存数据原来的状态;
  • 要求掌握Spark Streaming的窗口函数;
  • 要求熟练编写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"

要求:

  1. 统计每天的日活跃人数;
  2. 统计每小时的活跃人数;
  3. 统计每小时请求URL排名前十名;
  4. 统计出国家|省每日活跃数;
  5. 根据User Agent统计每日终端信息;
3.2 Flink编程

假设下面是一部分用户登录状态的日志。固定格式为:(用户ID IP 请求状态 时间)

e4ec9bb6f2703eb7 180.21.76.203 success 1558430815 1f85152896978527 171.43.190.8 fail 1558430826

要求:

  1. 使用状态编程输出5秒内连续登录失败超过3次的用户;
  2. 使用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大约150W左右,现在要求根据关卡值做一个游戏排行榜 你会如何设计?

4 大数据企业级架构设计4.1 架构设计

游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)(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

4.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= c1

4.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存储数据分类效果概览

游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)(2)

s3.png

4.2.5 150w日活每天产生数据大小

游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)(3)

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;

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.sql

4.3.5 Zeppelin整合Spark和Hive

游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)(4)

zeppelin.png

4.3.6 Spark作业日志

游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)(5)

spark-history-jobs.png

4.4 实时数据分析

Fink消费kafka数据统计每1小时内购总额并写入ES、每小时url请求Top10、每小时日活人数。

4.4.1 Flink的WebUI

游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)(6)

flink-job.png

4.4.2 Flink统计每小时内购总数并写到ES

游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)(7)

es.png

4.5 大数据集群监测

游戏行业分析表(最全大数据知识点分析和企业级游戏行业架构设计分享)(8)

cloudera-manager.png

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页