飞鸟各投林

导航

Hadoop应用开发实战案例 第2周 Web日志分析项目 张丹

课程内容

本文链接:

张丹博客 http://www.fens.me
用Maven构建Hadoop项目 http://blog.fens.me/hadoop-maven-eclipse/
程序源代码下载:https://github.com/bsspirit/maven_hadoop_template/releases/tag/kpi_v1
Flume部署:  http://blog.csdn.net/zhouleilei/article/details/8568147  周雷雷博客
Chukwa部署: 详情见陆嘉恒书第415页

 

关于张丹

骨灰级程序员, 大数据创业者
DataguruID: bsspirit
Weibo: @Conan_Z
Blog:http://blog.fens.me
Email: bsspirit@gmail.com

 

项目背景:Web日志分析
需求分析:KPI指标
架构设计:日志分析系统架构
算法模型:Map-Reduce并行算法
程序开发:
            –用Maven构建Hadoop项目
            –MapReduce程序实现 

 

 

 

Web日志由Web服务器产生,可能是Nginx, Apache, Tomcat等。

从Web日志中,我们可以获取网站每个页面的PV值(PageView,页面访问量)、独立IP数
稍微复杂一些的,可以计算得出用户所检索的关键词排行榜、用户停留时间最高的页面等;
更复杂的,构建广告点击模型、分析用户行为特征等等。

 

项目背景: Nginx日志

Web日志中,每条日志通常代表着用户的一次访问行为
例如: 下面就是一条nginx日志
222.68.172.190 - - [18/Sep/2013:06:49:57 +0000] "GET /images/my.jpg HTTP/1.1" 200 19939 "http://www.angularjs.cn/A00n" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"

 

流行网站分析工具

1.Webtrends
2.Google分析
3.百度统计

 

项目背景:少量数据的情况

少量数据的情况(10Mb,100Mb,10G),在单机处理尚能忍受的时候,我可以直接利用各种Unix/Linux工具,awk、grep、sort、join等都是日志分析的利器,再配合perl, python,正则表达式,基本就可以解决所有的问题。
例如,从nginx日志中得到访问量最高前5个IP,实现很简单:

~ cat access.log.10 | awk '{a[$1]++} END {for(b in a) print b"\t"a[b]}' | sort -k2 -r | head -n 5

 

项目背景: 海量数据的情况

当数据量每天以10G、100G增长的时候,单机处理能力已经不能满足需求。我们就需要增加系统的复杂性,用计算机集群,存储阵列来解决。

在Hadoop出现之前,海量数据存储,和海量日志分析都是非常困难的。只有少数一些公司,掌握着高效的并行计算,分步式计算,分步式存储的核心技术。
Hadoop的出现,大幅度的降低了海量数据处理的门槛,让小公司甚至是个人都能力,搞定海量数据。并且,Hadoop非常适用于日志分析系统。

 

分布式日志的收集

1.脚本方案
2.Flume
3.Chukwa

 

架构设计:应用系统及日志系统架构

左边: Application业务系统
右边: Hadoop的HDFS, MapReduce。

 

架构设计:应用系统及日志系统架构

日志是由业务系统产生的,我们可以设置web服务器每天产生一个新的目录,目录下面会产生多个日志文件,每个日志文件64M。
设置系统定时器CRON,夜间在0点后,向HDFS导入昨天的日志文件。
完成导入后,设置系统定时器,启动MapReduce程序,提取并计算统计指标。
完成计算后,设置系统定时器,从HDFS导出统计指标数据到数据库,方便以后的即使查询。

 

架构设计:数据流

 

Flume

Cloudera提供的分布式、可靠、和高可用的海量日志采集、聚合和传输的系统
Flume提供了从console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系统,支持TCP和UDP等2种模式),exec(命令执行)等数据源上收集数据的能力。同时,Flume的数据接受方,可以是console(控制台)、text(文件)、dfs(HDFS文件)、RPC(Thrift-RPC)和syslogTCP(TCP syslog日志系统)等。

 

 

体系架构

data flow描述了数据从产生,传输、处理并最终写入目标的一条路径(图中的实线)。
Agent用于采集数据,是flume中产生数据流的地方,将产生的数据流传输到collector。
collector用于对数据进行聚合,往往会产生一个更大的流。
收集数据有2种主要工作模式,如下: Push Sources:外部系统会主动地将数据推送到Flume中。 Polling Sources:Flume到外部系统中获取数据。

 

Flume Master

用于管理数据流的配置

部署详情见:http://blog.csdn.net/zhouleilei/article/details/8568147          周雷雷博客

 

Chukwa

在印度神话中Chukwa是一只最古老的龟。它支撑着世界。在它的背上还支撑着一种叫做Maha-Pudma的大象,在大象的背上顶着这个地球。呵呵,大 象?Hadoop?不难理解为什么在Hadoop中的这个子项目叫做Chukwa了,或许Chukwa的其中一位开发者是印度人?呵呵,我瞎猜的,神话中 的Chukwa的,貌似是这样

 

架构图

 

部署Chukwa:详情见陆嘉恒书第415页

 

 

需求分析:案例介绍

某电子商务网站,在线团购业务。每日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: 用户的访问设备统计

 

注:商业保密限制,无法提供电商网站的日志。 下面的内容,将以我的个人网站为例提取数据进行分析, http://www.fens.me  张丹博客

 

需求分析: 电商网站VS个人网站

从商业的角度,个人网站的特征与电商网站不太一样,没有转化率,同时跳出率也比较高。
从技术的角度,同样都关注KPI指标设计
–PV, IP, 转化率, 跳出率, 在线时长, 来源网站,来源域名,外部链接
–搜索流量,搜索关键词
–入口页面,跳出页面,受访页面
–访客男女,访客年龄,访客位置
–使用设置,操作系统,浏览器,爬虫,RSS阅读器

 

拆解为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″

 

算法模型: 并行算法 1

PV(PageView): 页面访问量统计
–Map: {key:$request,value:1}
–Reduce: {key:$request,value:求和(sum)}
IP: 页面独立IP的访问量统计
–Map: {key:$request,value:$remote_addr}
–Reduce: {key:$request,value:去重再求和(sum(unique))}
Time: 用户每小时PV的统计
–Map: {key:$time_local,value:1}
–Reduce: {key:$time_local,value:求和(sum)}

 

算法模型: 并行算法 2

Source: 用户来源域名的统计
–Map: {key:$http_referer,value:1}
–Reduce: {key:$http_referer,value:求和(sum)}
Browser: 用户的访问设备统计
–Map: {key:$http_user_agent,value:1}
–Reduce: {key:$http_user_agent,value:求和(sum)}

 

程序开发: 用Maven构建Hadoop项目

 

开发环境
–Win7 64bit
–Java 1.6.0_45
–Maven3
–Eclipse Juno Service Release 2


Hadoop集群系统环境:
–Linux: Ubuntu 12.04.2 LTS 64bit Server
–Java: 1.6.0_29
–Hadoop: hadoop-1.0.3,单节点,IP:192.168.1.210


请参考文章:用Maven构建Hadoop项目 http://blog.fens.me/hadoop-maven-eclipse/

 

程序开发: 向HDFS导入日志文件

我们需要把日志文件,上传的HDFS里/user/hdfs/log_kpi/目录
参考下面的命令操作
~ hadoop fs -mkdir /user/hdfs/log_kpi
~ hadoop fs -copyFromLocal /home/conan/datafiles/access.log.10 /user/hdfs/log_kpi/

 

程序开发: MapReduce开发流程

对”日志行”的解析
Map函数实现
Reduce函数实现
启动程序实现

 

程序源代码下载:https://github.com/bsspirit/maven_hadoop_template/releases/tag/kpi_v1

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2016-04-09 19:19  飞鸟各投林  阅读(1912)  评论(2编辑  收藏  举报