此文献给正在大学迷茫或者即将进入大学计算机专业,将来想要从事大数据行业的学弟学妹们。学长给你们的建议在大学期间踏踏实实学习知识,不要好高骛远;多参加体育锻炼。做好这两点便可。切记不要往多领域发展,最终你会发现:仿佛这你也会那你也会,其实啥也不精还容易闹笑话。
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"
要求:
- 统计每天的日活跃人数;
- 统计每小时的活跃人数;
- 统计每小时请求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大约150W左右,现在要求根据关卡值做一个游戏排行榜 你会如何设计?
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-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存储数据分类效果概览
4.2.5 150w日活每天产生数据大小
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
)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.3.6 Spark作业日志
4.4 实时数据分析
Fink消费kafka数据统计每1小时内购总额并写入ES、每小时url请求Top10、每小时日活人数。