课程目标
v 理解网站点击流数据分析的业务背景
v 理解网站点击流数据分析中常用分析指标的业务含义
v 掌握网站点击流数据分析系统的技术架构
v 掌握网站点击流数据分析系统中各环节的技术实现
v 能独立设计完成一个初步的网站点击流数据分析系统
网站点击流数据分析,业务知识,推荐书籍:
《网站分析实战——如何以数据驱动决策,提升网站价值》王彦平,吴盛锋编著
1. 网站点击流数据分析项目业务背景
1.1 什么是点击流数据
1.1.1 WEB访问日志
即指用户访问网站时的所有访问、浏览、点击行为数据。比如点击了哪一个链接,在哪个网页停留时间最多,采用了哪个搜索项、总体浏览时间等。而所有这些信息都可被保存在网站日志中。通过分析这些数据,可以获知许多对网站运营至关重要的信息。采集的数据越全面,分析就能越精准。
² 日志的生成渠道:
1)是网站的web服务器所记录的web访问日志;
2)是通过在页面嵌入自定义的js代码来获取用户的所有访问行为(比如鼠标悬停的位置,点击的页面组件等),然后通过ajax请求到后台记录日志;这种方式所能采集的信息最全面;
3)通过在页面上埋点1像素的图片,将相关页面访问信息请求到后台记录日志;
² 日志数据内容详述:
在实际操作中,有以下几个方面的数据可以被采集:
1) 访客的系统属性特征。比如所采用的操作系统、浏览器、域名和访问速度等。
2) 访问特征。包括停留时间、点击的URL等。
3) 来源特征。包括网络内容信息类型、内容分类和来访URL等。
4) 产品特征。包括所访问的产品编号、产品类别、产品颜色、产品价格、产品利润、产品数量和特价等级等。
以电商某东为例,其点击日志格式如下:
GET /log.gif?t=item.010001&m=UA-J2011-1&pin=-&uid=1679790178&sid=1679790178|12&v=je=1$sc=24-bit$sr=1600x900$ul=zh-cn$cs=GBK$dt=【云南白药套装】云南白药牙膏 180g×3 (留兰香型)【行情报价价格评测】-京东$hn=item.jd.com$fl=16.0 r0$os=win$br=chrome$bv=39.0.2171.95$wb=1437269412$xb=1449548587$yb=1456186252$zb=12$cb=4$usc=direct$ucp=-$umd=none$uct=-$ct=1456186505411$lt=0$tad=-$sku=1326523$cid1=1316$cid2=1384$cid3=1405$brand=20583$pinid=-&ref=&rm=1456186505411 HTTP/1.1 |
1.1.2 点击流数据模型
点击流概念
点击流这个概念更注重用户浏览网站的整个流程,网站日志中记录的用户点击就像是图上的“点”,而点击流更像是将这些“点”串起来形成的“线”。也可以把“点”认为是网站的Page,而“线”则是访问网站的Session。所以点击流数据是由网站日志中整理得到的,它可以比网站日志包含更多的信息,从而使基于点击流数据统计得到的结果更加丰富和高效。
点击流模型生成
点击流数据在具体操作上是由散点状的点击日志数据梳理所得,从而,点击数据在数据建模时应该存在两张模型表(Pageviews和visits):
1、用于生成点击流的访问日志表
时间戳 |
IP地址 |
Session |
请求URL |
Referal |
2012-01-01 12:31:12 |
101.0.0.1 |
S001 |
/a/... |
somesite.com |
2012-01-01 12:31:16 |
201.0.0.2 |
S002 |
/a/... |
- |
2012-01-01 12:33:06 |
101.0.0.2 |
S002 |
/b/... |
baidu.com |
2012-01-01 15:16:39 |
234.0.0.3 |
S003 |
/c/... |
google.com |
2012-01-01 15:17:11 |
101.0.0.1 |
S004 |
/d/... |
/c/... |
2012-01-01 15:19:23 |
101.0.0.1 |
S004 |
/e/... |
/d/.... |
2、页面点击流模型Pageviews表(按session聚集的访问页面信息)
Session |
userid |
时间 |
访问页面URL |
停留时长 |
第几步 |
S001 |
User01 |
2012-01-01 12:31:12 |
/a/.... |
30 |
1 |
S002 |
User02 |
2012-01-01 12:31:16 |
/a/.... |
10 |
1 |
S002 |
User02 |
2012-01-01 12:33:06 |
/b/.... |
110 |
2 |
S002 |
User02 |
2012-01-01 12:35:06 |
/e/.... |
30 |
3 |
3、点击流模型Visits表
Session |
起始时间 |
结束时间 |
进入页面 |
离开页面 |
访问页面数 |
IP |
cookie |
referal |
S001 |
2012-01-01 12:31:12 |
2012-01-01 12:31:12 |
/a/... |
/a/... |
1 |
101.0.0.1 |
User01 |
somesite.com |
S002 |
2012-01-01 12:31:16 |
2012-01-01 12:35:06 |
/a/... |
/e/... |
3 |
201.0.0.2 |
User02 |
- |
S003 |
2012-01-01 12:35:42 |
2012-01-01 12:35:42 |
/c/... |
/c/... |
1 |
234.0.0.3 |
User03 |
baidu.com |
S004 |
2012-01-01 15:16:39 |
2012-01-01 15:19:23 |
/c/... |
/e/... |
3 |
101.0.0.1 |
User01 |
google.com |
…… |
…… |
…… |
…… |
…… |
…… |
…… |
…… |
…… |
这就是点击流模型。当WEB日志转化成点击流数据的时候,很多网站分析度量的计算变得简单了,这就是点击流的“魔力”所在。基于点击流数据我们可以统计出许多常见的网站分析度量
1.2网站流量数据分析的意义
网站流量统计分析,可以帮助网站管理员、运营人员、推广人员等实时获取网站流量信息,并从流量来源、网站内容、网站访客特性等多方面提供网站分析的数据依据。从而帮助提高网站流量,提升网站用户体验,让访客更多的沉淀下来变成会员或客户,通过更少的投入获取最大化的收入。
如下表:
网站的眼睛 |
网站的神经 |
网站的大脑 |
访问者来自哪里? 访问者在寻找什么? 哪些页面最受欢迎? 访问者从哪里进入?
|
网页布局合理吗? 网站导航清晰吗? 哪些功能存在问题 网站内容有效吗 转化路径靠谱吗? |
如何分解目标? 如何分配广告预算? 如何衡量产品表现? 哪些产品需要优化? 哪些指标需要关注? |
点击流分析的意义可分为两大方面:
1、技术上
可以合理修改网站结构及适度分配资源,构建后台服务器群组,比如
辅助改进网络的拓扑设计,提高性能
在有高度相关性的节点之间安排快速有效的访问路径
帮助企业更好地设计网站主页和安排网页内容
2、业务上
1) 帮助企业改善市场营销决策,如把广告放在适当的Web页面上。
2) 优化页面及业务流程设计,提高流量转化率。
3) 帮助企业更好地根据客户的兴趣来安排内容。
4) 帮助企业对客户群进行细分,针对不同客户制定个性化的促销策略等。
终极目标是:改善网站(电商、社交、电影、小说)的运营,获取更高投资回报率(ROI)
1.3 如何进行网站流量分析
流量分析整体来说是一个内涵非常丰富的体系,其整体过程是一个金字塔结构:
1.3.1 流量分析模型举例
通常有以下几大类的分析需求:
1)网站流量质量分析
流量对于每个网站来说都是很重要,但流量并不是越多越好,应该更加看重流量的质量,换句话来说就是流量可以为我们带来多少收入。
2)网站流量多维度细分
细分是指通过不同维度对指标进行分割,查看同一个指标在不同维度下的表现,进而找出有问题的那部分指标,对这部分指标进行优化。
3)网站内容及导航分析
对于所有网站来说,页面都可以被划分为三个类别:
v 导航页
v 功能页
v 内容页
首页和列表页都是典型的导航页;
站内搜索页面、注册表单页面和购物车页面都是典型的功能页,
而产品详情页、新闻和文章页都是典型的内容页。
比如从内容导航分析中,以下两类行为就是网站运营者不希望看到的行为:
第一个问题:访问者从导航页进入,在还没有看到内容页面之前就从导航页离开网站,需要分析导航页造成访问者中途离开的原因。
第二个问题:访问者从导航页进入内容页后,又返回到导航页,说明需要分析内容页的最初设计,并考虑中内容页提供交叉的信息推荐
4)网站转化及漏斗分析
所谓转化,即网站业务流程中的一个封闭渠道,引导用户按照流程最终实现业务目标(比如商品成交);而漏斗模型则是指进入渠道的用户在各环节递进过程中逐渐流失的形象描述;
对于转化渠道,主要进行两部分的分析:
访问者的流失和迷失
1、阻力和流失
造成流失的原因很多,如:
不恰当的商品或活动推荐
对支付环节中专业名词的解释、帮助信息等内容不当
2、迷失
造成迷失的主要原因是转化流量设计不合理,访问者在特定阶段得不到需要的信息,并且不能根据现有的信息作出决策
总之,网站流量分析是一门内容非常丰富的学科,本课程中主要关注网站分析过程中的技术运用,更多关于网站流量分析的业务知识可学习推荐资料。
1.3.2 流量分析常见指标
课程中涉及的分析指标主要位于以下几大方面:
1)基础分析(PV,IP,UV)
Ø 趋势分析:根据选定的时段,提供网站流量数据,通过流量趋势变化形态,为您分析网站访客的访问规律、网站发展状况提供参考。
Ø 对比分析:根据选定的两个对比时段,提供网站流量在时间上的纵向对比报表,帮您发现网站发展状况、发展规律、流量变化率等。
Ø 当前在线:提供当前时刻站点上的访客量,以及最近15分钟流量、来源、受访、访客变化情况等,方便用户及时了解当前网站流量状况。
Ø 访问明细:提供最近7日的访客访问记录,可按每个PV或每次访问行为(访客的每次会话)显示,并可按照来源、搜索词等条件进行筛选。通过访问明细,用户可以详细了解网站流量的累计过程,从而为用户快速找出流量变动原因提供最原始、最准确的依据。
2)来源分析
Ø 来源分类:提供不同来源形式(直接输入、搜索引擎、其他外部链接、站内来源)、不同来源项引入流量的比例情况。通过精确的量化数据,帮助用户分析什么类型的来路产生的流量多、效果好,进而合理优化推广方案。
Ø 搜索引擎:提供各搜索引擎以及搜索引擎子产品引入流量的比例情况。从搜索引擎引入流量的的角度,帮助用户了解网站的SEO、SEM效果,从而为制定下一步SEO、SEM计划提供依据。
Ø 搜索词:提供访客通过搜索引擎进入网站所使用的搜索词,以及各搜索词引入流量的特征和分布。帮助用户了解各搜索词引入流量的质量,进而了解访客的兴趣关注点、网站与访客兴趣点的匹配度,为优化SEO方案及SEM提词方案提供详细依据。
Ø 最近7日的访客搜索记录,可按每个PV或每次访问行为(访客的每次会话)显示,并可按照访客类型、地区等条件进行筛选。为您搜索引擎优化提供最详细的原始数据。
Ø 来路域名:提供具体来路域名引入流量的分布情况,并可按“社会化媒体”、“搜索引擎”、“邮箱”等网站类型对来源域名进行分类。帮助用户了解哪类推广渠道产生的流量多、效果好,进而合理优化网站推广方案。
Ø 来路页面:提供具体来路页面引入流量的分布情况。尤其对于通过流量置换、包广告位等方式从其他网站引入流量的用户,该功能可以方便、清晰地展现广告引入的流量及效果,为优化推广方案提供依据。
Ø 来源升降榜:提供开通统计后任意两日的TOP10000搜索词、来路域名引入流量的对比情况,并按照变化的剧烈程度提供排行榜。用户可通过此功能快速找到哪些来路对网站流量的影响比较大,从而及时排查相应来路问题。
3)受访分析
Ø 受访域名:提供访客对网站中各个域名的访问情况。一般情况下,网站不同域名提供的产品、内容各有差异,通过此功能用户可以了解不同内容的受欢迎程度以及网站运营成效。
Ø 受访页面:提供访客对网站中各个页面的访问情况。站内入口页面为访客进入网站时浏览的第一个页面,如果入口页面的跳出率较高则需要关注并优化;站内出口页面为访客访问网站的最后一个页面,对于离开率较高的页面需要关注并优化。
Ø 受访升降榜:提供开通统计后任意两日的TOP10000受访页面的浏览情况对比,并按照变化的剧烈程度提供排行榜。可通过此功能验证经过改版的页面是否有流量提升或哪些页面有巨大流量波动,从而及时排查相应问题。
Ø 热点图:记录访客在页面上的鼠标点击行为,通过颜色区分不同区域的点击热度;支持将一组页面设置为"关注范围",并可按来路细分点击热度。通过访客在页面上的点击量统计,可以了解页面设计是否合理、广告位的安排能否获取更多佣金等。
Ø 用户视点:提供受访页面对页面上链接的其他站内页面的输出流量,并通过输出流量的高低绘制热度图,与热点图不同的是,所有记录都是实际打开了下一页面产生了浏览次数(PV)的数据,而不仅仅是拥有鼠标点击行为。
Ø 访问轨迹:提供观察焦点页面的上下游页面,了解访客从哪些途径进入页面,又流向了哪里。通过上游页面列表比较出不同流量引入渠道的效果;通过下游页面列表了解用户的浏览习惯,哪些页面元素、内容更吸引访客点击。
4)访客分析
Ø 地区运营商:提供各地区访客、各网络运营商访客的访问情况分布。地方网站、下载站等与地域性、网络链路等结合较为紧密的网站,可以参考此功能数据,合理优化推广运营方案。
Ø 终端详情:提供网站访客所使用的浏览终端的配置情况。参考此数据进行网页设计、开发,可更好地提高网站兼容性,以达到良好的用户交互体验。
Ø 新老访客:当日访客中,历史上第一次访问该网站的访客记为当日新访客;历史上已经访问过该网站的访客记为老访客。新访客与老访客进入网站的途径和浏览行为往往存在差异。该功能可以辅助分析不同访客的行为习惯,针对不同访客优化网站,例如为制作新手导航提供数据支持等。
Ø 忠诚度:从访客一天内回访网站的次数(日访问频度)与访客上次访问网站的时间两个角度,分析访客对网站的访问粘性、忠诚度、吸引程度。由于提升网站内容的更新频率、增强用户体验与用户价值可以有更高的忠诚度,因此该功能在网站内容更新及用户体验方面提供了重要参考。
Ø 活跃度:从访客单次访问浏览网站的时间与网页数两个角度,分析访客在网站上的活跃程度。由于提升网站内容的质量与数量可以获得更高的活跃度,因此该功能是网站内容分析的关键指标之一。
5)转化路径分析
转化定义
·访客在您的网站完成了某项您期望的活动,记为一次转化,如注册或下载。
目标示例
·获得用户目标:在线注册、创建账号等。
·咨询目标:咨询、留言、电话等。
·互动目标:视频播放、加入购物车、分享等。
·收入目标:在线订单、付款等。
转化数据的应用
·在报告的自定义指标中勾选转化指标,实时掌握网站的推广及运营情况。
·结合“全部来源”、“转化路径”、“页面上下游”等报告分析访问漏斗,提高转化率。
·对“转化目标”设置价值,预估转化收益,衡量ROI。
路径分析:根据设置的特定路线,监测某一流程的完成转化情况,算出每步的转换率和流失率数据,如注册流程,购买流程等。
转化类型:
1、页面
2、事件
2 整体技术流程及架构
2.1 数据处理流程
该项目是一个纯粹的数据分析项目,其整体流程基本上就是依据数据的处理流程进行,依此有以下几个大的步骤:
1) 数据采集
首先,通过页面嵌入JS代码的方式获取用户访问行为,并发送到web服务的后台记录日志
然后,将各服务器上生成的点击流日志通过实时或批量的方式汇聚到HDFS文件系统中
当然,一个综合分析系统,数据源可能不仅包含点击流数据,还有数据库中的业务数据(如用户信息、商品信息、订单信息等)及对分析有益的外部数据。
2) 数据预处理
通过mapreduce程序对采集到的点击流数据进行预处理,比如清洗,格式整理,滤除脏数据等
3) 数据入库
将预处理之后的数据导入到HIVE仓库中相应的库和表中
4) 数据分析
项目的核心内容,即根据需求开发ETL分析语句,得出各种统计结果
5) 数据展现
将分析所得数据进行可视化
2.2 项目结构
由于本项目是一个纯粹数据分析项目,其整体结构亦跟分析流程匹配,并没有特别复杂的结构,如下图:
其中,需要强调的是:
系统的数据分析不是一次性的,而是按照一定的时间频率反复计算,因而整个处理链条中的各个环节需要按照一定的先后依赖关系紧密衔接,即涉及到大量任务单元的管理调度,所以,项目中需要添加一个任务调度模块
2.3 数据展现
数据展现的目的是将分析所得的数据进行可视化,以便运营决策人员能更方便地获取数据,更快更简单地理解数据
3 模块开发——数据采集
3.1 需求
数据采集的需求广义上来说分为两大部分。
1)是在页面采集用户的访问行为,具体开发工作:
1、开发页面埋点js,采集用户访问行为
2、后台接受页面js请求记录日志
此部分工作也可以归属为“数据源”,其开发工作通常由web开发团队负责
2)是从web服务器上汇聚日志到HDFS,是数据分析系统的数据采集,此部分工作由数据分析平台建设团队负责,具体的技术实现有很多方式:
² Shell脚本
优点:轻量级,开发简单
缺点:对日志采集过程中的容错处理不便控制
² Java采集程序
优点:可对采集过程实现精细控制
缺点:开发工作量大
² Flume日志采集框架
成熟的开源日志采集系统,且本身就是hadoop生态体系中的一员,与hadoop体系中的各种框架组件具有天生的亲和力,可扩展性强
3.2 技术选型
在点击流日志分析这种场景中,对数据采集部分的可靠性、容错能力要求通常不会非常严苛,因此使用通用的flume日志采集框架完全可以满足需求。
本项目即使用flume来实现日志采集。
3.3 Flume日志采集系统搭建
1、数据源信息
本项目分析的数据用nginx服务器所生成的流量日志,存放在各台nginx服务器上,如:
/var/log/httpd/access_log.2015-11-10-13-00.log
/var/log/httpd/access_log.2015-11-10-14-00.log
/var/log/httpd/access_log.2015-11-10-15-00.log
/var/log/httpd/access_log.2015-11-10-16-00.log
2、数据内容样例
数据的具体内容在采集阶段其实不用太关心。
58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" 304 0 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0" |
字段解析:
1、访客ip地址: 58.215.204.118
2、访客用户信息: - -
3、请求时间:[18/Sep/2013:06:51:35+0000]
4、请求方式:GET
5、请求的url:/wp-includes/js/jquery/jquery.js?ver=1.10.2
6、请求所用协议:HTTP/1.1
7、响应码:304
8、返回的数据流量:0
9、访客的来源url:http://blog.fens.me/nodejs-socketio-chat/
10、访客所用浏览器:Mozilla/5.0 (Windows NT5.1; rv:23.0) Gecko/20100101 Firefox/23.0
3、日志文件生成规律
基本规律为:
当前正在写的文件为access_log;
文件体积达到256M,或时间间隔达到60分钟,即滚动重命名切换成历史日志文件;
形如: access_log.2015-11-10-13-00.log
当然,每个公司的web服务器日志策略不同,可在web程序的log4j.properties中定义,如下:
log4j.appender.logDailyFile = org.apache.log4j.DailyRollingFileAppender log4j.appender.logDailyFile.layout = org.apache.log4j.PatternLayout log4j.appender.logDailyFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n log4j.appender.logDailyFile.Threshold = DEBUG log4j.appender.logDailyFile.ImmediateFlush = TRUE log4j.appender.logDailyFile.Append = TRUE log4j.appender.logDailyFile.File = /var/logs/access_log log4j.appender.logDailyFile.DatePattern = '.'yyyy-MM-dd-HH-mm'.log' log4j.appender.logDailyFile.Encoding = UTF-8 |
4、Flume采集实现
Flume采集系统的搭建相对简单:
1、在个web服务器上部署agent节点,修改配置文件
2、启动agent节点,将采集到的数据汇聚到指定的HDFS目录中
如下图:
² 版本选择:apache-flume-1.6.0
² 采集规则设计:
1、 采集源:nginx服务器日志目录
2、 存放地:hdfs目录/home/hadoop/weblogs/
² 采集规则配置详情
agent1.sources = source1 agent1.sinks = sink1 agent1.channels = channel1
# Describe/configure spooldir source1 #agent1.sources.source1.type = spooldir #agent1.sources.source1.spoolDir = /var/logs/nginx/ #agent1.sources.source1.fileHeader = false
# Describe/configure tail -F source1 #使用exec作为数据源source组件 agent1.sources.source1.type = exec #使用tail -F命令实时收集新产生的日志数据 agent1.sources.source1.command = tail -F /var/logs/nginx/access_log agent1.sources.source1.channels = channel1
#configure host for source #配置一个拦截器插件 agent1.sources.source1.interceptors = i1 agent1.sources.source1.interceptors.i1.type = host #使用拦截器插件获取agent所在服务器的主机名 agent1.sources.source1.interceptors.i1.hostHeader = hostname
#配置sink组件为hdfs agent1.sinks.sink1.type = hdfs #a1.sinks.k1.channel = c1 #agent1.sinks.sink1.hdfs.path=hdfs://hdp-node-01:9000/weblog/flume-collection/%y-%m-%d/%H%M%S #指定文件sink到hdfs上的路径 agent1.sinks.sink1.hdfs.path= hdfs://hdp-node-01:9000/weblog/flume-collection/%y-%m-%d/%H-%M_%hostname #指定文件名前缀 agent1.sinks.sink1.hdfs.filePrefix = access_log agent1.sinks.sink1.hdfs.maxOpenFiles = 5000 #指定每批下沉数据的记录条数 agent1.sinks.sink1.hdfs.batchSize= 100 agent1.sinks.sink1.hdfs.fileType = DataStream agent1.sinks.sink1.hdfs.writeFormat =Text #指定下沉文件按1G大小滚动 agent1.sinks.sink1.hdfs.rollSize = 1024*1024*1024 #指定下沉文件按1000000条数滚动 agent1.sinks.sink1.hdfs.rollCount = 1000000 #指定下沉文件按30分钟滚动 agent1.sinks.sink1.hdfs.rollInterval = 30 #agent1.sinks.sink1.hdfs.round = true #agent1.sinks.sink1.hdfs.roundValue = 10 #agent1.sinks.sink1.hdfs.roundUnit = minute agent1.sinks.sink1.hdfs.useLocalTimeStamp = true
# Use a channel which buffers events in memory #使用memory类型channel agent1.channels.channel1.type = memory agent1.channels.channel1.keep-alive = 120 agent1.channels.channel1.capacity = 500000 agent1.channels.channel1.transactionCapacity = 600
# Bind the source and sink to the channel agent1.sources.source1.channels = channel1 agent1.sinks.sink1.channel = channel1 |
启动采集
在部署了flume的nginx服务器上,启动flume的agent,命令如下:
bin/flume-ng agent --conf ./conf -f./conf/weblog.properties.2 -n agent
注意:启动命令中的 -n 参数要给配置文件中配置的agent名称
4 模块开发——数据预处理
4.1 主要目的:
过滤“不合规”数据
格式转换和规整
根据后续的统计需求,过滤分离出各种不同主题(不同栏目path)的基础数据
4.2 实现方式:
开发一个mr程序WeblogPreProcess(内容太长,见工程代码)
public class WeblogPreProcess { static class WeblogPreProcessMapper extends Mapper<LongWritable, Text, Text, NullWritable> { Text k = new Text(); NullWritable v = NullWritable.get(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); WebLogBean webLogBean = WebLogParser.parser(line); // WebLogBean productWebLog = WebLogParser.parser2(line); // WebLogBean bbsWebLog = WebLogParser.parser3(line); // WebLogBean cuxiaoBean = WebLogParser.parser4(line); if (!webLogBean.isValid()) return; k.set(webLogBean.toString()); context.write(k, v); // k.set(productWebLog); // context.write(k, v); } } public static void main(String[] args) throws Exception {
Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(WeblogPreProcess.class); job.setMapperClass(WeblogPreProcessMapper.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true);
} }
|
l 运行mr对数据进行预处理
hadoop jar weblog.jar cn.itcast.bigdata.hive.mr.WeblogPreProcess /weblog/input /weblog/preout |
4.3 点击流模型数据梳理
由于大量的指标统计从点击流模型中更容易得出,所以在预处理阶段,可以使用mr程序来生成点击流模型的数据
4.3.1 点击流模型pageviews表
Pageviews表模型数据生成
代码见工程
hadoop jar weblogpreprocess.jar \ cn.itcast.bigdata.hive.mr.ClickStreamThree \ /user/hive/warehouse/dw_click.db/test_ods_weblog_origin/datestr=2013-09-20/ /test-click/pageviews/ |
表结构:
(表定义及数据导入见6.2节)
4.3.2 点击流模型visit信息表
注:“一次访问”=“N次连续请求”
直接从原始数据中用hql语法得出每个人的“次”访问信息比较困难,可先用mapreduce程序分析原始数据得出“次”信息数据,然后再用hql进行更多维度统计
用MR程序从pageviews数据中,梳理出每一次visit的起止时间、页面信息
代码见工程 hadoop jar weblogpreprocess.jar cn.itcast.bigdata.hive.mr.ClickStreamVisit /weblog/sessionout /weblog/visitout |
然后,在hive仓库中建点击流visit模型表
drop table if exist click_stream_visit; create table click_stream_visit( session string, remote_addr string, inTime string, outTime string, inPage string, outPage string, referal string, pageVisits int) partitioned by (datestr string); |
然后,将MR运算得到的visit数据导入visit模型表
load data inpath '/weblog/visitout' into table click_stream_visit partition(datestr='2013-09-18'); |
5 模块开发——数据仓库设计
注:采用星型模型
5.1 事实表
原始数据表:t_origin_weblog |
||
valid |
string |
是否有效 |
remote_addr |
string |
访客ip |
remote_user |
string |
访客用户信息 |
time_local |
string |
请求时间 |
request |
string |
请求url |
status |
string |
响应码 |
body_bytes_sent |
string |
响应字节数 |
http_referer |
string |
来源url |
http_user_agent |
string |
访客终端信息 |
ETL中间表:t_etl_referurl |
||
valid |
string |
是否有效 |
remote_addr |
string |
访客ip |
remote_user |
string |
访客用户信息 |
time_local |
string |
请求时间 |
request |
string |
请求url |
request_host |
string |
请求的域名 |
status |
string |
响应码 |
body_bytes_sent |
string |
响应字节数 |
http_referer |
string |
来源url |
http_user_agent |
string |
访客终端信息 |
valid |
string |
是否有效 |
remote_addr |
string |
访客ip |
remote_user |
string |
访客用户信息 |
time_local |
string |
请求时间 |
request |
string |
请求url |
status |
string |
响应码 |
body_bytes_sent |
string |
响应字节数 |
http_referer |
string |
外链url |
http_user_agent |
string |
访客终端信息 |
host |
string |
外链url的域名 |
path |
string |
外链url的路径 |
query |
string |
外链url的参数 |
query_id |
string |
外链url的参数值 |
访问日志明细宽表:t_ods_access_detail |
||
valid |
string |
是否有效 |
remote_addr |
string |
访客ip |
remote_user |
string |
访客用户信息 |
time_local |
string |
请求时间 |
request |
string |
请求url整串 |
request_level1 |
string |
请求的一级栏目 |
request_level2 |
string |
请求的二级栏目 |
request_level3 |
string |
请求的三级栏目 |
status |
string |
响应码 |
body_bytes_sent |
string |
响应字节数 |
http_referer |
string |
来源url |
http_user_agent |
string |
访客终端信息 |
valid |
string |
是否有效 |
remote_addr |
string |
访客ip |
remote_user |
string |
访客用户信息 |
time_local |
string |
请求时间 |
request |
string |
请求url |
status |
string |
响应码 |
body_bytes_sent |
string |
响应字节数 |
http_referer |
string |
外链url |
http_user_agent |
string |
访客终端信息整串 |
http_user_agent_browser |
string |
访客终端浏览器 |
http_user_agent_sys |
string |
访客终端操作系统 |
http_user_agent_dev |
string |
访客终端设备 |
host |
string |
外链url的域名 |
path |
string |
外链url的路径 |
query |
string |
外链url的参数 |
query_id |
string |
外链url的参数值 |
daystr |
string |
日期整串 |
tmstr |
string |
时间整串 |
month |
string |
月份 |
day |
string |
日 |
hour |
string |
时 |
minute |
string |
分 |
## |
## |
## |
mm |
string |
分区字段--月 |
dd |
string |
分区字段--日 |
5.2 维度表
时间维度v_year_month_date |
year |
month |
day |
hour |
minute |
访客地域维度t_dim_area |
北京 |
上海 |
广州 |
深圳 |
河北 |
河南 |
终端类型维度t_dim_termination |
uc |
firefox |
chrome |
safari |
ios |
android |
网站栏目维度 t_dim_section |
跳蚤市场 |
房租信息 |
休闲娱乐 |
建材装修 |
本地服务 |
人才市场 |
下期继续!