离线数据分析适用于数据规模大、处理实时性要求不高的场景,例如用户行为分析、用户留存分析、报表统计等等。基于百度智能云大数据平台,用户可以便捷地实现离线数据分析,包括数据的采集、数据清洗、数据仓库以及商业智能展现。
通常是指对海量数据进分析和处理,形成结果数据,供下一步数据应用使用。离线处理对处理时间要求不高,但是所处理数据量较大,占用计算存储资源较多,通常通过mr或者spark作业或者sql作业实现。离线分析系统架构中以hdfs分布式存储软件为数据底座,计算引擎以基于mapreduce的hive和基于spark的sparksql为主。
具体而言,可以通过使用bls(百度logservice)、bos(百度对象存储)、bmr(mapreduce)、palo(百度olap引擎)这些产品实现上述场景。我们以常见的用户访问日志分析场景作为示例,离线处理架构图如下图所示:
首先,用户访问日志保存在web服务器的文件系统,通过在bls服务创建传输任务,把相关服务器上的日志收集到bos进行存储;然后使用bmr集群运行hive作业对日志数据进行清洗和处理,输出的目标数据仍保存在bos;最后,把目标数据从bos导入到olap引擎palo中,即可进行多维分析。百度智能云palo还支持对接兼容jdbc接口的可视化分析应用,更加直观、便捷地展示数据分析结果。
参考文档
使用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}的格式。
配置好bls传输任务后,预期每天的日志都将传输到指定的bos目录。nginx日志包含字段较多,我们需要进行选择并转换字段来得到符合需求的数据。这一步我们可以使用bmr定时任务功能,每天定期运行hive作业,对导入bos的日志数据进行用户活跃留存统计。
在本案例中,具体操作步骤如下:
创建集群模板,操作入口是bmr产品控制台左侧导航栏“集群模板”-页面中部主体“创建模板”按钮:
创建模块的参数填写需要注意两点:
集群节点配置是根据具体作业任务的规模来配置的,如果不了解实际规模可以先保持默认节点配置,后续根据作业运行耗时情况来重新配置。
创建定时任务,操作入口是bmr产品控制台左侧导航栏“定时任务”-页面中部主体“创建任务”按钮:
配置定时任务主要是选择集群模板、执行策略以及作业。集群模板需要选择刚才创建的集群模板。执行策略可以根据实际业务需要进行选择。这里以每天运行数据分析举例,配置执行频率是每1天。任务开始时间为立即开始(如果需要第二天一早看到数据结果,可以把开始时间定为凌晨某个时间点)。
添加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作业样例请参考文档。
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为例:
连接palo集群。使用的配置信息均可以在palo集群的详情页面查看到:
建立数据库。
create database quanmin;
建立数据表。目前需要建两张表,一张是包含所有数据和字段的明细表(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)
最后进行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"
);
使用主流的bi/可视化工具进行数据分析与展现。palo支持jdbc接口连接访问,因此对于兼容jdbc接口的bi/可视化工具都能连接palo集群,对我们导入的数据进行可视化分析。
注意: