离线应用场景

场景描述

离线数据分析适用于数据规模大、处理实时性要求不高的场景,例如用户行为分析、用户留存分析、报表统计等等。基于百度智能云大数据平台,用户可以便捷地实现离线数据分析,包括数据的采集、数据清洗、数据仓库以及商业智能展现。具体而言,可以通过使用BLS(百度LogService)、BOS(百度对象存储)、BMR(百度MapReduce)、Palo(百度OLAP引擎)这些产品实现上述场景。我们以常见的用户访问日志分析场景作为示例,离线处理架构图如下图所示:

首先,用户访问日志保存在WEB服务器的文件系统,通过在BLS服务创建传输任务,把相关服务器上的日志收集到BOS进行存储;然后使用BMR集群运行Hive作业对日志数据进行清洗和处理,输出的目标数据仍保存在BOS;最后,把目标数据从BOS导入到OLAP引擎Palo中,即可进行多维分析。百度智能云Palo还支持对接兼容JDBC接口的可视化分析应用,更加直观、便捷地展示数据分析结果。

数据采集

第一部分 通过BLS服务采集日志

参考文档

使用BLS服务首先需要在目标机器上安装收集器,收集器负责从BLS服务接收传输任务,并把日志数据从本地磁盘上传到BOS指定目录。

在本案例中,我们的Web服务器上运行了nginx进程,并且把nginx日志生成路径配置在/var/log/nginx/下,日志文件的格式为access.log.yyyyMMdd,根据日期进行轮转,每天生成一个新的日志文件,比如2017年3月20号的日志将都保存在文件access.log.20170320中。为了将这些日志文件收集到BOS保存,我们在BLS服务创建一个新的传输任务,具体配置信息如下图所示。源端类型为“目录”,将“源日志目录”配置为nginx日志所在目录:/var/log/nginx,“匹配文件规则”配置为日志文件的正则表达式:^access.log.[0-9]{8}$。

目的端设置中,选择“日志投递目的”为“BOS”,并且通过下拉选框选择BOS上目的路径为“bos://quanmin-log/"。另外,我们可以根据日志聚合的需要,在BOS端重新组织日志数据的目录结构。在本案例中,我们勾选“根据时间聚合”,注意选择源日志文件的时间戳为yyyyMMdd,这是跟我们服务器上日志文件名中的时间戳正则匹配的,BLS收集器将根据这个正则去匹配日志文件名,从而得到改日志文件对应的时间数据。然后,我们选择“用户自定义”,这里是配置具体的聚合路径,我们填入配置“%Y%m%d”,也就是把BOS目的端路径配置为bos://nginx-logs/%Y%m%d/。由于Web服务器有多台,我们需要把日志来源的服务器也在日志保存路径中体现出来,因此勾选“根据主机聚合”,并选择按主机ip聚合。最终,在BOS上保存的日志数据的路径将符合bos://quanmin-log/%Y%m%d/%{ip}的格式。

数据清洗

第二部分 创建BMR集群,运行定时任务

配置好BLS传输任务后,预期每天的日志都将传输到指定的BOS目录。nginx日志包含字段较多,我们需要进行选择并转换字段来得到符合需求的数据。这一步我们可以使用BMR定时任务功能,每天定期运行Hive作业,对导入BOS的日志数据进行用户活跃留存统计。

在本案例中,具体操作步骤如下:

  1. 创建集群模板,操作入口是BMR产品控制台左侧导航栏“集群模板”-页面中部主体“创建模板”按钮:

    创建模块的参数填写需要注意两点:

    • 启动“自动终止”,该选项说明在定时任务完成后自动释放集群,停止计费。如果不启动,则定时任务执行过程创建出的集群将一直保持活跃状态,计入产品费用:

    • 注意添加hive应用,否则集群将不能运行hive作业:

    集群节点配置是根据具体作业任务的规模来配置的,如果不了解实际规模可以先保持默认节点配置,后续根据作业运行耗时情况来重新配置。

  2. 创建定时任务,操作入口是BMR产品控制台左侧导航栏“定时任务”-页面中部主体“创建任务”按钮:

    配置定时任务主要是选择集群模板、执行策略以及作业。集群模板需要选择刚才创建的集群模板。执行策略可以根据实际业务需要进行选择。这里以每天运行数据分析举例,配置执行频率是每1天。任务开始时间为立即开始(如果需要第二天一早看到数据结果,可以把开始时间定为凌晨某个时间点)。

  3. 添加Hive作业到定时任务中。我们编写的Hive作业将对原始日志数据进行如下处理:

    1)对空值附以对业务无意义的数值。

    由于Palo不支持空值字段,需要对日志中的空值字段做一定处理,目前均处理为0。

    2)将IP信息转化为地址位置信息。

    通过IP-GEO库与UDF把IP信息转化为地理位置信息,精确到市一级,同时提供经纬度信息便于在可视化工具中做地图报表。

    3)将时间字段打散为多个字段。

    为方便下载查询,将日志中的时间字段打散为年、月、日、时、分等五个字段。同时为了在Palo中声明为date类型从而加快查询速度,且不丢失字段本身的含义,年、月字段需满足yyyy-mm-dd格式的合法值,故年字段统一为当年第一天,月字段统一为当月第一天,例如2016年表示为2016-01-01,2016年7月表示为2016-07-01。

    4)统计用户次日留存情况。

    次日留存定义为当天的所有访问IP中在前一天也访问过的IP子集,也就是一个客户端IP在某天及其前一天都出现在nginx访问日志中,则可认为该IP是一个次日留存客户。

    点击“确定”。样例定时任务就只有一个Hive作业,因此可以点击“完成”提交定时任务。

    标准创建定时任务的步骤请参考文档

    标准的Hive作业样例请参考文档

报表展现

第三部分 Palo建表与数据导入

BMR运行hive作业处理过后的数据保存在BOS上,本案例中,上面定时任务运行hive作业,配置的BOS输出地址是bos://quanmin-bmr/hive-output/%Y%m%d/access_pv/,其中“%Y%m%d”将根据任务实际执行日期替换为数字,比如20160601。为了把BMR清洗好的数据导入Palo,我们首先需要在Palo预先建立好数据库表。首先,在Palo服务创建一个新集群,具体创建步骤请参考文档

集群创建好以后, Palo提供兼容MySQL的接口,可以直接使用MySQL的相关库或者工具进行连接Palo集群(目前Palo只支持MySQL 5.0以上的客户端,在连接之前请确认您的客户端版本)。以MySQL Workbench为例:

  1. 连接Palo集群。使用的配置信息均可以在Palo集群的详情页面查看到:

    • hostname:factory.baidu.com
    • port:7036
    • username:superuser@cluster_id,实例中cluster_id为599531639

  2. 建立数据库。

    CREATE DATABASE QUANMIN;
    
  3. 建立数据表。目前需要建两张表,一张是包含所有数据和字段的明细表(detail table),一张是次日留存表(retain_day table,当前页包含了所有字段)。这里我们给出datail表的建表语句:

    CREATE TABLE detail
    (
    platform int,
    action varchar(100),  
    v1 varchar(100),  
    v2 varchar(100),    
    year date, 
    month date, 
    day date,
    hour datetime,   
    minute datetime,
    time datetime, 
    user_id int,
    device varchar(50),
    ip varchar(20),  
    server_ip varchar(20),  
    province_name varchar(50),  
    city_name varchar(50),  
    longitude varchar(20),  
    latitude varchar(20),  
    pv int sum
    )
    engine = olap
    partition by range(time) (
    PARTITION p1 VALUES LESS THAN ("2016-08-01 00:00:00"),
    PARTITION p2 VALUES LESS THAN ("2016-10-01 00:00:00")
    )
    distributed by hash(platform)
    
  4. 最后进行BOS数据导入,在MySQL Workbench继续执行语句:

    load label detail1 (
    data infile("bos://quanmin-bmr/hive-output/2016-07-30/*") into table
    `detail` columns terminated by "," (platform, action, v1, v2, user_id, device, time, year, month, day, hour,minute, ip, server_ip, province_name, city_name,longitude, latitude, pv)
    )
    PROPERTIES(
    "bos_accesskey" ="your_ak",
    "bos_secret_accesskey" = "your_sk",
    "bos_endpoint"= "http://bj.bcebos.com"
    );
    
  5. 使用主流的BI/可视化工具进行数据分析与展现。Palo支持JDBC接口连接访问,因此对于兼容JDBC接口的BI/可视化工具都能连接Palo集群,对我们导入的数据进行可视化分析。

    完整的Palo导入BOS数据的语句规则请参考文档

注意:

  • 每次成功导入后,下次需要使用不同的导入label,导入语句中的your_ak、your_sk需要替换为实际的ak、sk。百度智能云使用ak、sk验证用户身份,请妥善保管。
  • 导入过程中,可以通过 “SHOW LOAD;” 命令查看load过程。
  • 导入成功后,即可通过MySQL客户端和BI/可视化工具进行查询分析。