数据采集 => 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 = 10000
    1
    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-21

    data-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
    27
    SCRIPT_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
    14
    select 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
    4
    mapred.max.split.size=256000000

    hive临时设置,可在脚本中执行
    set mapred.max.split.size 256000000;

    调整reduce个数:

    1
    2
    3
    4
    5
    6
    7
    hive.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
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
27
28
29
30
31
32
33
34
35
36
37
38
SCRIPT_HOME=/data/lagoudw/script/member_active

# 加载 ODS 层数据(文件与表建立关联)
sh $SCRIPT_HOME/ods_load_startlog.sh 2020-07-22

# 加载 ODS 层数据(解析json数据)
sh $SCRIPT_HOME/dwd_load_startlog.sh 2020-07-22

# 活跃会员 sh $SCRIPT_HOME/dws_load_member_start.sh 2020-07-22
sh $SCRIPT_HOME/ads_load_member_active.sh 2020-07-22

# 新增会员
sh $SCRIPT_HOME/dws_load_member_add_day.sh 2020-07-22
sh $SCRIPT_HOME/ads_load_member_add.sh 2020-07-22

# 会员留存
sh $SCRIPT_HOME/dws_load_member_retention_day.sh 2020-07-22
sh $SCRIPT_HOME/ads_load_member_retention.sh 2020-07-22

SCRIPT_HOME=/data/lagoudw/script/member_active

# 加载 ODS 层数据(文件与表建立关联)
sh $SCRIPT_HOME/ods_load_startlog.sh 2020-07-23

# 加载 ODS 层数据(解析json数据)
sh $SCRIPT_HOME/dwd_load_startlog.sh 2020-07-23

# 活跃会员
sh $SCRIPT_HOME/dws_load_member_start.sh 2020-07-23
sh $SCRIPT_HOME/ads_load_member_active.sh 2020-07-23

# 新增会员
sh $SCRIPT_HOME/dws_load_member_add_day.sh 2020-07-23
sh $SCRIPT_HOME/ads_load_member_add.sh 2020-07-23

# 会员留存
sh $SCRIPT_HOME/dws_load_member_retention_day.sh 2020-07-23
sh $SCRIPT_HOME/ads_load_member_retention.sh 2020-07-23

会员留存率的计算


1
2
SCRIPT_HOME=/data/lagoudw/script/member_active
sh $SCRIPT_HOME/ads_load_member_retention.sh 2020-07-23