可以带着下面问题来阅读文章
问题:
1.MapReduce在日志分析的作用
思考:
该如何架构kpi系统,需要考虑什么问题。
Web日志包含着网站最重要的信息,通过日志分析,我们可以知道网站的访问量,哪个网页访问人数最多,哪个网页最有价值等。一般中型的网站(10W的PV以上),每天会产生1G以上Web日志文件。大型或超大型的网站,可能每小时就会产生10G的数据量。
对于日志的这种规模的数据,用Hadoop进行日志分析,是最适合不过的了。
目录
在Web日志中,每条日志通常代表着用户的一次访问行为,例如下面就是一条nginx日志: 拆解为以下8个变量
利用这些日志信息,我们可以深入挖掘网站的秘密了。
少量数据的情况
少量数据的情况(10Mb,100Mb,10G),在单机处理尚能忍受的时候,我可以直接利用各种Unix/Linux工具,awk、grep、sort、join等都是日志分析的利器,再配合perl, python,正则表达工,基本就可以解决所有的问题。
例如,我们想从上面提到的nginx日志中得到访问量最高前10个IP,实现很简单: 海量数据的情况
当数据量每天以10G、100G增长的时候,单机处理能力已经不能满足需求。我们就需要增加系统的复杂性,用计算机集群,存储阵列来解决。在Hadoop出现之前,海量数据存储,和海量日志分析都是非常困难的。只有少数一些公司,掌握着高效的并行计算,分步式计算,分步式存储的核心技术。
Hadoop的出现,大幅度的降低了海量数据处理的门槛,让小公司甚至是个人都能力,搞定海量数据。并且,Hadoop非常适用于日志分析系统。
2.需求分析:KPI指标设计 下面我们将从一个公司案例出发来全面的解释,如何用进行 海量Web日志分析,提取KPI数据。
案例介绍
某电子商务网站,在线团购业务。每日PV数100w,独立IP数5w。用户通常在工作日上午10:00-12:00和下午15:00-18:00访问量最大。日间主要是通过PC端浏览器访问,休息日及夜间通过移动设备访问较多。网站搜索浏量占整个网站的80%,PC用户不足1%的用户会消费,移动用户有5%会消费。
通过简短的描述,我们可以粗略地看出,这家电商网站的经营状况,并认识到愿意消费的用户从哪里来,有哪些潜在的用户可以挖掘,网站是否存在倒闭风险等。
KPI指标设计
3.算法模型:Hadoop并行算法 基本统计指标:
用户的访问设备统计指标:
从商业的角度,个人网站的特征与电商网站不太一样,没有转化率,同时跳出率也比较高。从技术的角度,同样都关注KPI指标设计。
3.算法模型:Hadoop并行算法
并行算法的设计:
注:找到第一节有定义的8个变量
PV(PageView): 页面访问量统计
上图中,左边是Application业务系统,右边是Hadoop的HDFS, MapReduce。
上面这幅图,我们可以看得更清楚,数据是如何流动的。蓝色背景的部分是在Hadoop中的,接下来我们的任务就是完成MapReduce的程序实现。
5.程序开发1:用Maven构建Hadoop项目 请参考文章: 用Maven构建Hadoop项目
win7的开发环境 和 Hadoop的运行环境 ,在上面文章中已经介绍过了。
我们需要放日志文件,上传的HDFS里/user/hdfs/log_kpi/目录,参考下面的命令操作 我已经把整个MapReduce的实现都放到了github上面: 6.程序开发2:MapReduce程序实现 开发流程:
新建文件:org.conan.myhadoop.mr.kpi.KPI.java 从日志文件中,取一行通过main函数写一个简单的解析测试。
控制台输出: 我们看到日志行,被正确的解析成了kpi对象的属性。我们把解析过程,单独封装成一个方法。 对map方法,reduce方法,启动方法,我们单独写一个类来实现
下面将分别介绍MapReduce的实现类:
PV:org.conan.myhadoop.mr.kpi.KPIPV.java
IP: org.conan.myhadoop.mr.kpi.KPIIP.java
Time: org.conan.myhadoop.mr.kpi.KPITime.java
Browser: org.conan.myhadoop.mr.kpi.KPIBrowser.java
1). PV:org.conan.myhadoop.mr.kpi.KPIPV.java 在程序中会调用KPI类的方法 通过filterPVs方法,我们可以实现对PV,更多的控制。
在KPK.java中,增加filterPVs方法 在filterPVs方法,我们定义了一个pages的过滤,就是只对这个页面进行PV统计。
我们运行一下KPIPV.java 用hadoop命令查看HDFS文件 这样我们就得到了,刚刚日志文件中的,指定页面的PV值。
指定页面,就像网站的站点地图一样,如果没有指定所有访问链接都会被找出来,通过“站点地图”的指定,我们可以更容易地找到,我们所需要的信息。
源代码下载地址:
问题:
1.MapReduce在日志分析的作用
思考:
该如何架构kpi系统,需要考虑什么问题。
kpi:关键绩效指标法,即KPI绩效考核,是企业绩效考核的方法之一,其特点是考核指标围绕关键成果领域进行选取,均对关键绩效指标考核法的应用及其特点有所介绍。
前言
Web日志包含着网站最重要的信息,通过日志分析,我们可以知道网站的访问量,哪个网页访问人数最多,哪个网页最有价值等。一般中型的网站(10W的PV以上),每天会产生1G以上Web日志文件。大型或超大型的网站,可能每小时就会产生10G的数据量。
对于日志的这种规模的数据,用Hadoop进行日志分析,是最适合不过的了。
目录
- Web日志分析概述
- 需求分析:KPI指标设计
- 算法模型:Hadoop并行算法
- 架构设计:日志KPI系统架构
- 程序开发1:用Maven构建Hadoop项目
- 程序开发2:MapReduce程序实现
在Web日志中,每条日志通常代表着用户的一次访问行为,例如下面就是一条nginx日志: 拆解为以下8个变量
- remote_addr: 记录客户端的ip地址, 222.68.172.190
- remote_user: 记录客户端用户名称, –
- time_local: 记录访问时间与时区, [18/Sep/2013:06:49:57 +0000]
- request: 记录请求的url与http协议, “GET /images/my.jpg HTTP/1.1″
- status: 记录请求状态,成功是200, 200
- body_bytes_sent: 记录发送给客户端文件主体内容大小, 19939
- http_referer: 用来记录从那个页面链接访问过来的, “http://www.angularjs.cn/A00n”
- http_user_agent: 记录客户浏览器的相关信息, “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36″
利用这些日志信息,我们可以深入挖掘网站的秘密了。
少量数据的情况
少量数据的情况(10Mb,100Mb,10G),在单机处理尚能忍受的时候,我可以直接利用各种Unix/Linux工具,awk、grep、sort、join等都是日志分析的利器,再配合perl, python,正则表达工,基本就可以解决所有的问题。
例如,我们想从上面提到的nginx日志中得到访问量最高前10个IP,实现很简单: 海量数据的情况
当数据量每天以10G、100G增长的时候,单机处理能力已经不能满足需求。我们就需要增加系统的复杂性,用计算机集群,存储阵列来解决。在Hadoop出现之前,海量数据存储,和海量日志分析都是非常困难的。只有少数一些公司,掌握着高效的并行计算,分步式计算,分步式存储的核心技术。
Hadoop的出现,大幅度的降低了海量数据处理的门槛,让小公司甚至是个人都能力,搞定海量数据。并且,Hadoop非常适用于日志分析系统。
2.需求分析:KPI指标设计 下面我们将从一个公司案例出发来全面的解释,如何用进行 海量Web日志分析,提取KPI数据。
案例介绍
某电子商务网站,在线团购业务。每日PV数100w,独立IP数5w。用户通常在工作日上午10:00-12:00和下午15:00-18:00访问量最大。日间主要是通过PC端浏览器访问,休息日及夜间通过移动设备访问较多。网站搜索浏量占整个网站的80%,PC用户不足1%的用户会消费,移动用户有5%会消费。
通过简短的描述,我们可以粗略地看出,这家电商网站的经营状况,并认识到愿意消费的用户从哪里来,有哪些潜在的用户可以挖掘,网站是否存在倒闭风险等。
KPI指标设计
- PV(PageView): 页面访问量统计
- IP: 页面独立IP的访问量统计
- Time: 用户每小时PV的统计
- Source: 用户来源域名的统计
- Browser: 用户的访问设备统计
3.算法模型:Hadoop并行算法 基本统计指标:
用户的访问设备统计指标:
从商业的角度,个人网站的特征与电商网站不太一样,没有转化率,同时跳出率也比较高。从技术的角度,同样都关注KPI指标设计。
3.算法模型:Hadoop并行算法
并行算法的设计:
注:找到第一节有定义的8个变量
PV(PageView): 页面访问量统计
- Map过程{key:$request,value:1}
- Reduce过程{key:$request,value:求和(sum)}
- Map: {key:$request,value:$remote_addr}
- Reduce: {key:$request,value:去重再求和(sum(unique))}
- Map: {key:$time_local,value:1}
- Reduce: {key:$time_local,value:求和(sum)}
- Map: {key:$http_referer,value:1}
- Reduce: {key:$http_referer,value:求和(sum)}
- Map: {key:$http_user_agent,value:1}
- Reduce: {key:$http_user_agent,value:求和(sum)}
上图中,左边是Application业务系统,右边是Hadoop的HDFS, MapReduce。
- 日志是由业务系统产生的,我们可以设置web服务器每天产生一个新的目录,目录下面会产生多个日志文件,每个日志文件64M。
- 设置系统定时器CRON,夜间在0点后,向HDFS导入昨天的日志文件。
- 完成导入后,设置系统定时器,启动MapReduce程序,提取并计算统计指标。
- 完成计算后,设置系统定时器,从HDFS导出统计指标数据到数据库,方便以后的即使查询。
上面这幅图,我们可以看得更清楚,数据是如何流动的。蓝色背景的部分是在Hadoop中的,接下来我们的任务就是完成MapReduce的程序实现。
5.程序开发1:用Maven构建Hadoop项目 请参考文章: 用Maven构建Hadoop项目
win7的开发环境 和 Hadoop的运行环境 ,在上面文章中已经介绍过了。
我们需要放日志文件,上传的HDFS里/user/hdfs/log_kpi/目录,参考下面的命令操作 我已经把整个MapReduce的实现都放到了github上面: 6.程序开发2:MapReduce程序实现 开发流程:
- 对日志行的解析
- Map函数实现
- Reduce函数实现
- 启动程序实现
新建文件:org.conan.myhadoop.mr.kpi.KPI.java 从日志文件中,取一行通过main函数写一个简单的解析测试。
控制台输出: 我们看到日志行,被正确的解析成了kpi对象的属性。我们把解析过程,单独封装成一个方法。 对map方法,reduce方法,启动方法,我们单独写一个类来实现
下面将分别介绍MapReduce的实现类:
PV:org.conan.myhadoop.mr.kpi.KPIPV.java
IP: org.conan.myhadoop.mr.kpi.KPIIP.java
Time: org.conan.myhadoop.mr.kpi.KPITime.java
Browser: org.conan.myhadoop.mr.kpi.KPIBrowser.java
1). PV:org.conan.myhadoop.mr.kpi.KPIPV.java 在程序中会调用KPI类的方法 通过filterPVs方法,我们可以实现对PV,更多的控制。
在KPK.java中,增加filterPVs方法 在filterPVs方法,我们定义了一个pages的过滤,就是只对这个页面进行PV统计。
我们运行一下KPIPV.java 用hadoop命令查看HDFS文件 这样我们就得到了,刚刚日志文件中的,指定页面的PV值。
指定页面,就像网站的站点地图一样,如果没有指定所有访问链接都会被找出来,通过“站点地图”的指定,我们可以更容易地找到,我们所需要的信息。
源代码下载地址:
http://pan.baidu.com/s/1jG9L2mi
转自:http://www.aboutyun.com/thread-6832-1-1.html