网站流量日志数据分析系统
点击流数据模型
- 点击流(Click Stream)是指用户在网站上持续访问的轨迹,我们通过对网站日志的分析可以获得用户的点击流数据。
- 点击数据在数据建模时存在两张模型表 Pageviews 和 visits
网站流量分析
- 网站流量分析模型举例
- 网站流量质量分析
流量并不是越多越好,应该更加看重流量的质量 网站流量多维度细分
细分是指通过不同维度对指标进行分割网站内容及导航分析
第一个问题:访问者从导航页(首页)还没有看到内容页面之前就从导航页
离开网站,需要分析导航页造成访问者中途离开的原因。
第二个问题:访问者从导航页进入内容页后,又返回到导航页,说明需要分
析内容页的最初设计,并考虑中内容页提供交叉的信息推荐。
- 网站转化以及漏斗分析
①阻力的流失
比如:不恰当的商品或活动推荐,对支付环节中专业名词的解释、帮助信息等内容不当。
②迷失
比如在线购买演唱会门票,直到支付也没看到在线选座的提示,这时候就很可能会产生迷失,返回查看。
- 流量分析常见分类
指标是网站分析的基础,用来记录和衡量访问者在网站自的各种行为。
- 骨灰级指标:IP访问网站的不重复 IP 数、PageView页面被加载的总次数、Unique PageView访问网站的不重复用户数
- 基础级指标:访问次数、网站停留时间、页面停留时间
- 复合级指标:人均浏览页数、跳出率(单页访问)、退出率
整体技术流程及架构
数据处理流程
- 数据采集:定制开发采集程序,或使用开源框架 Flume
- 数据预处理:定制开发 mapreduce 程序运行于 hadoop 集群
- 数据仓库技术:基于 hadoop 之上的 Hive
- 数据导出:基于 hadoop 的 sqoop 数据导入导出工具
- 数据可视化:定制开发 web 程序(echarts)或使用 kettle 等产品
- 整个过程的流程调度:hadoop 生态圈中的 azkaban 工具或其他类似 开源产品
项目结构
模块开发---- 数据采集
Flume日志采集系统搭建
nginx文件存储日志不会自动地进行切割,都是写在一个文件 access.log 当中,切割需要使用 date 命令以获得昨天的日期、使用 kill 命令向 Nginx 进程发送重新打开日志文件的信号,以及 crontab 设置执行任务周期。
自动切割 shell 脚本 nginx_log.sh:
#!/bin/bash
#设置日志文件存放目录
logs_path="/usr/local/nginx/logs/"
#设置 pid 文件
pid_path="/usr/local/nginx/nginx-1.7.3/logs/nginx.pid"
#日志文件
filepath=${logs_path}"access.log"
# Source function library.
#重命名日志文件
mv ${logs_path}access.log ${logs_path}access_$(date -d '-1 day' '+%Y-%m-%d').log
#向 nginx 主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`
crontab设置作业(每天零时零分执行)
#设置日志文件存放目录 crontab -e
0 0 * * * sh /usr/local/nginx/nginx_log.sh
采集实现
- 在个 web 服务器上部署 agent 节点,修改配置文件
- 启动 agent 节点,将采集到的数据汇聚到指定的 HDFS 目录中
使用aildirSource,可以监控一个目录,并且使用正则表达式匹配该目录中的文件名进行实时收集。
#核心配置
a1.sources = r1
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /var/log/flume/taildir_position.json
a1.sources.r1.filegroups = f1 f2
a1.sources.r1.filegroups.f1 = /var/log/test1/example.log
a1.sources.r1.filegroups.f2 = /var/log/test2/.*log.*
- filegroups:指定 filegroups,可以有多个,以空格分隔;(TailSource 可以同时监控tail 多个目录中的文件)
- positionFile:配置检查点文件的路径,检查点文件会以 json 格式保存已经 tail 文件的位置,解决了断点不能续传的缺陷。
- filegroups.:配置每个 filegroup 的文件绝对路径,文件名可以用正则表达式匹配
模块开发----数据预处理
主要目的
- 清理不合规无意义的数据
- 格式转换和规整
- 根据后续的统计需求,过滤分离出各种不同主题的基础数据。
模块开发---- 数据仓库设计
维度建模基本概念
维度建模(dimensional modeling)是专门用于分析型数据库、数据仓库、数据集市建模的方法。
- 维度表
- 事实表
事实表的设计是以能够正确记录历史信息为准则,维度表的设计是以能够以合适的角度来聚合主题内容为准则。
维度建模三种模式
- 星型模式是以事实表为中心,所有的维度表直接连接在事实表上
- 雪花模式的维度表可以拥有其他维度表的
- 星座模式是基于多张事实表的,而且共享维度信息
本项目中数据仓库的设计
- 事实表设计
- 维度表设计
模块开发----ETL
ETL 工作的实质就是从各个数据源提取数据,对数据进行转换,并最终加载填充数据到数据仓库维度建模后的表中。只有当这些维度/事实表被填充好,ETL工作才算完成。
- 源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
- 细节层(DW):为数据仓库层,DW 层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
- 应用层(DA 或 APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。
创建ODS层数据表
#原始日志数据表
drop table if exists ods_weblog_origin;
create table exists ods_weblog_origin(
valid string,
remote_addr string,
remote_user string,
time_local string,
request string,
status string,
body_bytes_sent string,
http_referer string,
http_user_agent string
)
partitioned by (datestr string)
row format delimited fields terminated by '\001';
#点击流模型 pageviews
drop table if exists ods_click_pageviews;
create table ods_click_pageviews(
session string,
remote_addr string,
remote_user string,
time_local string,
request string,
visit_step string,
page_staylong string,
http_referer string,
http_user_agent string,
body_bytes_sent string,
status string
)
partitioned by (datestr string)
row format delimited fields terminated by '\001';
#点击流visit表
drop table if exists ods_click_stream_visit;
create table ods_click_stream_visit(
session string,
remote_addr string,
inTime string,
outTime string,
inPage string,
outPage string,
referal string,
pageVisits int
)
partitioned by (datestr string)
row format delimited
fields terminated by '\001';
#维度表示例
drop table if exists t_dim_time;
create table t_dim_time(date_key int,year string,month string,day string,hour string) row format delimited fields terminated by ',';
导入ODS层数据
#导入清洗结果数据到贴源数据表ods_weblog_origin
load data inpath '/weblog/preprocessed/' overwrite into table ods_weblog_origin partition(datestr='20130918');
show partitions ods_weblog_origin;
select count(*) from ods_weblog_origin;
#导入点击流模型pageviews数据到ods_click_pageviews表
load data inpath '/weblog/clickstream/pageviews' overwrite into table ods_click_pageviews partition(datestr='20130918');
#导入点击流模型visit数据到ods_click_stream_visit表
load data inpath '/weblog/clickstream/visits' overwrite into table ods_click_stream_visit partition(datestr='20130918');
#时间维度表数据导入
load data inpath '/weblog/dim_time' overwrite into table t_dim_time;
注:生产环境中应该将数据 load 命令,写在脚本中,然后配置在 azkaban中定时运行,注意运行的时间点,应该在预处理数据完成之后。
生成ODS层明细宽表
#创建明细宽表
drop table ods_weblog_detail;
create table ods_weblog_detail(
valid string,
remote_addr string,
remote_user string,
time_local string,
daystr string,
timestr string,
month string,
day string,
hour string,
request string,
status string,
body_bytes_sent string,
http_referer string,
ref_host string,
ref_path string,
ref_query string,
ref_query_id string,
http_user_agent string
)
partitioned by(datestr string);
#将来访url分离出host path query query id 到中间表 t_ods_tmp_referurl
#"http://www.google.com/url?id=6216&sa=t&rct=j"
create table t_ods_tmp_referurl as
SELECT a.*,b.*
FROM ods_weblog_origin a
LATERAL VIEW parse_url_tuple(regexp_replace(http_referer, "\"", ""), 'HOST', 'PATH','QUERY', 'QUERY:id') b as host, path, query, query_id;
#抽取转换time_local字段到中间表明细表 t_ods_tmp_detail
#2013-09-18 06:49:48
create table t_ods_tmp_detail as
select b.*,substring(time_local,1,10) as daystr,
substring(time_local,12) as tmstr,
substring(time_local,6,2) as month,
substring(time_local,9,2) as day,
substring(time_local,11,3) as hour
From t_ods_tmp_referurl b;
insert into table ods_weblog_detail partition(datestr='20130918')
select c.valid,c.remote_addr,c.remote_user,
c.time_local,c.daystr,c.tmstr,c.month,c.day,c.hour,
c.request,c.status,c.body_bytes_sent,
c.http_referer,c.host,c.path,c.query,c.query_id,
c.http_user_agent
from t_ods_tmp_detail c;
模块开发----统计分析
1. 流量分析
多维度统计PV总量
1. 按时间(每小时、每天、每月)
2. 按终端 (http_user_agent)
3. 按栏目 (域名二级目录)
#计算该处理批次(一天)中的各小时pvs,dw_pvs_everyhour_oneday
按照来访维度统计pv
#统计每小时各来访host的产生的pv数并排序,查询结果存入:( "dw_pvs_refererhost_everyhour" )
统计pv总量最大的来源TOPN
#按照时间维度,统计一天内各小时产生最多pvs的来源topN,row_number函数
人均浏览页数
#统计今日所有来访者平均请求的页面数。
#总页面请求数/去重总人数
2. 受访分析 (从页面的角度分析)
各页面访问统计
#各页面PV,根据request
热门页面统计
#统计每日最热门的页面top10
3. 访客分析
独立访客
#按照时间维度比如小时来统计独立访客及其产生的 pv。
#对于独立访客的识别,如果在原始日志中有用户标识,则根据用户标识即很好实现;此处以访客 IP 来模拟
每日新访客
#创建一个去重访客累积表,然后将每日访客对比累积表。
4. 访客Visit分析(点击流模型)
回头/ 单次访客统计
#查询今日所有回头访客及其访问次数
#出现次数>1 的访客,即回头访客;反之,则为单次访客
人均访问频次
#统计出每天所有用户访问网站的平均次数,总 visit 数/去重总用户数
5. 关键路径转化率分析
转化:在一条指定的业务流程中,各个步骤的完成人数及相对上一个步骤的百分比。
1. 查询每一个步骤的总访问人数
UNION 将多个 SELECT 语句的结果集合并为一个独立的结果集。
2. 查询每一步骤相对于路径起点人数的比例
级联查询,利用自 join
3. 查询每一步骤相对于上一步骤的漏出率
4. 汇总以上两种指标
模块开发----结果导出
Sqoop 是Hadoop 和关系数据库服务器之间传送数据的一种工具。它是用来从关系数据库如:MySQL,Oracle 到 Hadoop 的 HDFS,并从 Hadoop 的文件系统导出数据到关系数据库。
模块开发----工作流调度
整个项目的数据按照处理过程,从数据采集到数据分析,再到结果数据的导出,一系列的任务可以分割成若干个 azkaban 的 job 单元,然后由工作流调度器调度执行。shell 脚本大体框架:
#!/bin/bash
#set java env
#set hadoop env
#设置一些主类、目录等常量
#获取时间信息
#shell 主程序、结合流程控制(if....else)去分别执行 shell 命令。
模块开发----数据可视化
Echarts是一款由百度前端技术部开发的,基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。
提供大量常用的 数据可视化图表,底层基于ZRender (一个全新的轻量级canvas类库),创建了坐标系,图例,提示,工具箱等基础组件,并在此上构建出折线图(区域图)、柱状图(条状图)、散点图(气泡图)、饼图(环形图)、K 线图、地图、力导向布局图以及和弦图,同时支持任意维度的堆积和多图表混合展现。