• Azkaban作业题--统计今日活跃用户数


    题目

    现有用户点击行为数据文件,每天产生会上传到hdfs目录,按天区分目录,现在我们需要每天凌晨两点定时导入Hive表指定分区中,并统计出今日活跃用户数插入指标表中。

    日志文件(clicklog)

    userId   click_time             index
    uid1 2020-06-21 12:10:10 a.html 
    uid2 2020-06-21 12:15:10 b.html 
    uid1 2020-06-21 13:10:10 c.html 
    uid1 2020-06-21 15:10:10 d.html 
    uid2 2020-06-21 18:10:10 e.html

    说明:用户点击行为数据,三个字段是用户id,点击时间,访问页面

    hdfs目录会以日期划分文件,例如

    /user_clicks/20200621/clicklog.dat
    /user_clicks/20200622/clicklog.dat
    /user_clicks/20200623/clicklog.dat
    ...

    Hive表

    原始数据分区表

    create table user_clicks(id string,click_time string ,index string) partitioned by(dt string) row format delimited fields terminated by '	' ;

    需要开发一个import.job每日从hdfs对应日期目录下同步数据到该表指定分区。(日期格式同上或者自定义)

    指标表

    create table user_info(active_num string,dateStr string) row format delimited fields terminated by '	';

    需要开发一个analysis.job依赖import.job执行,统计出每日活跃用户(一个用户出现多次算作一次)数并插入user_inof表中。

    需求

    开发以上提到的两个job,job文件内容和sql内容需分开展示,并能使用azkaban调度执行。

     实现

     import1.job

    type=command
    command=/usr/bin/sh /root/job/import.sh

    import.sh

    前面一段有一个时间处理来模拟不同天份的执行,通过返回日期,通过load data到指定的日起目录,将上游的点击数据input到指定表homework.user_clicks的对用分区中,将SQL写为文件提供给import2.job调度。

    #!/bin/bash
    
    time=$(date "+%M")
    sub=$[$time/3]
    
    if [ $sub -eq 0 ];then
      echo "$sub, 20200621"
      dt="20200621"
    elif [ $sub -eq 1 ];then
      echo "$sub, 20200622"
      dt="20200622"
    else
      dt="20200623"
      echo "$sub, 20200623"
    fi
    
    sql='load data inpath "/data/'$dt'/clicklog.dat" into table homework.user_clicks PARTITION(dt='$dt');'
    echo $sql > /root/job/import.sql

    import2.job

    依赖于import1的完成,通过hive -f命令完成装数

    type=command
    dependencies=import1
    command=nohup /opt/hive/hive-2.3.7/bin/hive -f /root/job/import.sql > /root/job/import.log &

    analysis1.job

    依赖于import2的完成生成对应的SQL文件

    type=command
    dependencies=import2
    command=/usr/bin/sh /root/job/analysis.sh

    analysis.sh

    #!/bin/bash
    
    time=$(date "+%M")
    sub=$[$time/3]
    
    if [ $sub -eq 0 ];then
      echo "$sub, 20200621"
      dt="20200621"
    elif [ $sub -eq 1 ];then
      echo "$sub, 20200622"
      dt="20200622"
    else
      dt="20200623"
      echo "$sub, 20200623"
    fi
    
    sql="insert into table homework.user_info select count(distinct id),'$dt' from homework.user_clicks where dt='$dt'"
    echo $sql > /root/job/analysis.sql

    analysis2.job

    依赖于analysis1.job对已装载的数据进行数据汇总,并插入到homework.user_info汇总表中。

    type=command
    dependencies=analysis1
    command=nohup /opt/hive/hive-2.3.7/bin/hive -f /root/job/analysis.sql > /root/job/analysis.log &

    备注:

    任务依赖关系:

  • 相关阅读:
    .JS replace方法替换所有字符
    .net framework 4.0,结果还是失败,出现HRESULT 0xc8000222错误代码
    用PowerDesigner15自动将数据库里的表生成ER图
    C#对JSON数据格式的处理
    Type of conditional expression cannot be determined because there is no implicit conversion between 'Common.EnumType.EnumGender' and '<null>'
    如何在string.Format方法中输出大括号({})
    网架构学习笔记
    c#实现javascript中函数escape解码
    Solon 开发,八、注入依赖与初始化
    Solon 开发,七、自定义注解开发汇总
  • 原文地址:https://www.cnblogs.com/aloneme/p/14957290.html
Copyright © 2020-2023  润新知