会员活跃度分析之高仿日启动数据测试
数据采集 => ODS => DWD => DWS => ADS> MySQL
活跃会员、新增会员、会员留存
DAU: Daily Active User(日活跃用户)
MAU: monthly active user(月活跃用户)
假设App的DAU在1000W左右,日启动数据大概 1000W 条;
测试3天的数据:7月21日、7月22日、7月23日。1000W条数据约3.5G+,每条记录约370字节。
Hive on MR测试
-
使用 flume 采集数据(采集3天的数据)
修改flume的参数:1G滚动一次;加大channel缓存;加大刷新 hdfs 的缓存
1
2
3
4
5
6
7
8# 配置文件滚动方式(文件大小1G)
a1.sinks.k1.hdfs.rollSize = 1073741824
a1.channels.c1.capacity = 500000
a1.channels.c1.transactionCapacity = 20000
# 向hdfs上刷新的event个数
a1.sinks.k1.hdfs.batchSize = 100001
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 清理工作。删除元数据文件、日志、hdfs等文件
rm -f /data/lagoudw/conf/startlog_position.json
rm -rf /data/lagoudw/logs/start/*
hdfs dfs -rm -r -f /user/data/logs/start/dt=2020-07-21
# 启动flume
flume-ng agent --conf /opt/apps/flume-1.9.0/conf --conf-file /data/lagoudw/conf/flume-log2hdfs4.conf -name a1 -Dflume.root.logger=INFO,console
# 写日志
java -cp data-generator-1.1-SNAPSHOT-jar-with-dependencies.jar com.lagou.ecommerce.AppStart 1 10000000 2020-07-21 > /data/lagoudw/logs/start/start0721.log
java -cp data-generator-1.1-SNAPSHOT-jar-with-dependencies.jar com.lagou.ecommerce.AppStart 6000000 16000000 2020-07-22 > /data/lagoudw/logs/start/start0722.log
java -cp data-generator-1.1-SNAPSHOT-jar-with-dependencies.jar com.lagou.ecommerce.AppStart 8000000 18000000 2020-07-23 > /data/lagoudw/logs/start/start0723.log
# 检查 hdfs 文件是否到达
hdfs dfs -ls /user/data/logs/start/dt=2020-07-21data-generator-1.1-SNAPSHOT-jar-with-dependencies.jar是生产数据的程序
1个文件大小3.5G,时间4分钟左右
-
执行脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27SCRIPT_HOME=/data/lagoudw/script/member_active
# 加载 ODS 层数据(文件与表建立关联)
sh $SCRIPT_HOME/ods_load_startlog.sh 2020-07-21
# 加载 ODS 层数据(解析json数据)
sh $SCRIPT_HOME/dwd_load_startlog.sh 2020-07-21
# number of mappers: 14; number of reducers: 0
# 是一个 map-only 的 Task;只对输入的数据做格式上的转换,没有聚合操作 (即没有reduce task)
# mapred.max.split.size=256M;3.5G / 256M = 14 Mapper Task
# 活跃会员
sh $SCRIPT_HOME/dws_load_member_start.sh 2020-07-21
# number of mappers: 3; number of reducers: 2
# 调整了task的内存分配(根据实际情况分配)
# 任务执行时间:3.5 + 3 + 3 = 10分钟
# ODS(Text) => 14个map => DWD(parquet) => 小文件合并 256M切分 => 3 map
sh $SCRIPT_HOME/ads_load_member_active.sh 2020-07-21
# 新增会员
sh $SCRIPT_HOME/dws_load_member_add_day.sh 2020-07-21
sh $SCRIPT_HOME/ads_load_member_add.sh 2020-07-21
# 会员留存
sh $SCRIPT_HOME/dws_load_member_retention_day.sh 2020-07-21
sh $SCRIPT_HOME/ads_load_member_retention.sh 2020-07-21相关表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14select count(*) from ods.ods_start_log where dw='2020-07-21';
select count(*) from dwd.dwd_start_log where dw='2020-07-21';
select count(*) from dws.dws_member_start_day where dw='2020- 07-21';
select count(*) from dws.dws_member_start_week where dw='2020- 07-21';
select count(*) from dws.dws_member_start_month where dw='2020-07-21';
select count(*) from dws.dws_member_add_day where dw='2020-07- 21';
select count(*) from dws.dws_member_retention_day where dw='2020-07-21';
select count(*) from ads.ads_member_active_count where dw='2020-07-21';
select count(*) from ads.ads_new_member_cnt where dw='2020-07- 21';
select count(*) from ads.ads_member_retention_count where dw='2020-07-21';
select count(*) from ads.ads_member_retention_rate where dw='2020-07-21'; -
遇到的问题
Error: Java heap space,原因:内存分配问题
解决思路:给map、reduce task分配合理的内存;map、reduce task处理合理的数据
现在情况下map task分配了多少内存?使用的是缺省参数每个task分配200M内存【mapred.child.java.opts】
每个节点:8 core / 32G;mapred.child.java.opts = 3G
1
2
3
4<property>
<name>mapred.child.java.opts</name>
<value>-Xmx3072m</value>
</property>调整map个数
1
2
3
4mapred.max.split.size=256000000
hive临时设置,可在脚本中执行
set mapred.max.split.size 256000000;调整reduce个数:
1
2
3
4
5
6
7hive.exec.reducers.bytes.per.reducer
hive.exec.reducers.max
hive临时设置,可在脚本中执行
set hive.exec.reducers.bytes.per.reducer 256000000;
set hive.exec.reducers.max 16000;
Hive on Tez测试
确定Tez已安装
07-22(新增600W) / 0723(新增200W):1000W条左右,执行脚本
1 | SCRIPT_HOME=/data/lagoudw/script/member_active |
会员留存率的计算
1 | SCRIPT_HOME=/data/lagoudw/script/member_active |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WeiJia_Rao!