到这一步,如果按照前面到文章一步走来,不出意外,我想hadoop平台环境应该搭建OK了。下面我以本身工做中实际的案例来梳理一下整个流程。同时参考一些其余的文章来分析,因为不少网站的日志KPI都大同小异,故有些指标直接在文中赘述了。javascript
从2011年开始,中国进入大数据时代如火如荼,以Hadoop为表明的套件,占据了大数据处理的广阔地盘。开源界及厂商,全部数据软件,纷纷向Hadoop靠拢。Hadoop也从小规模的试点和使用,变成了大数据开发的标准。在Hadoop原有技术基础之上,出现了Hadoop家族产品,经过大数据概念的不断创新,推动了Hadoop的发展速度。java
现在,Hadoop2.x的出现,使不少企业纷纷主动去接受Hadoop这个平台,所以,做为IT界的开发人员,了解并掌握Hadoop的技能,成为开发人员必备的一项技能。也是从此主流的一种趋势。python
注:Hadoop2.x的出现为什么引发这么大大反响,这里不作赘述。mysql
Web日志包含着网站最重要的信息,经过日志分析,咱们能够知道网站的访问量,哪一个网页访问人数最多,哪一个网页最有价值等。通常中型的网站(10w的PV以上),天天会产生1G以上的Web日志文件。大型或超大型的网站,可能每小时就产生10G的数据量。angularjs
对于日志的这种规模的数据,用Hadoop进行日志分析,是最合适不过了。正则表达式
Web日志由Web服务器产生,多是Nginx,Apache,Tomcat等。从Web日志中,咱们能够获取网站每类页面的PV值、独立IP数;稍微复杂一些的,能够计算得出用户所检索的关键词排行榜、用户停留时间最高的页面等;更复杂的,构建广告点击模型、分析用户行为特征等等。算法
Web日志中,每条日志一般表明着用户的一次访问行为,例以下面就是一条Nginx日志:sql
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"
咱们能够从中获取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"
注:要更多的信息,则须要其它手段去获取,经过javascript代码单独发送请求,使用cookies记录用户访问信息。利用这些日志信息,咱们能够深刻挖掘网站的秘密了。
少许数据的状况:
少许数据的状况(10M,100M,1G),在单机处理尚能接受的时候,咱们能够直接利用各类Unix/Linux工具,awk、grep、sort、join等都是日志分析的利器,再配合perl,python,正则表达式,基本就能够解决全部的问题。 例如,咱们想从上面提到的Nginx日志中获得访问量最高前10个IP,实现很简单:
~ cat access.log.10 | awk '{a[$1]++} END {for(b in a) print b"\t"a[b]}' | sort -k2 -r | head -n 10
结果若是下:
163.177.71.12 972 101.226.68.137 972 183.195.232.138 971 50.116.27.194 97 14.17.29.86 96 61.135.216.104 94 61.135.216.105 91 61.186.190.41 9 59.39.192.108 9 220.181.51.212 9
数据海量的状况:
当数据量天天以10G、100G增加的时候,单机处理能力已经不能知足需求。咱们就须要增长系统的复杂性,用计算机集群,存储阵列来解决。在Hadoop出现以前,海量数据存储和海量日志分析都是很困难的,只有少数公司,掌握着高效的并行计算,分布式计算,分布式存储的核心技术。 Hadoop的出现,大幅度的下降了海量数据处理的门槛,让小公司甚至是我的都可以处理海量数据。而且,Hadoop很是适用于日志分析系统。
下面咱们将从一个公司案例出发来全面的诠释,如何进行海量Web日志分析,提早KPI数据。
某电商网站,在线团购业务。每日PV数100w,独立IP数5w;用户一般在工做日上午10:00-12:00和下午15:00-18:00访问量最大;日间主要是经过PC端浏览器访问,休息日及夜间经过移动设备访问最多。网站搜索流量占整个网站的80%,PC用户不足1%的用户会消费,移动用户有5%会消费。
经过简短的描述,咱们能够粗略的看出这家电商网站的经营情况,并认识到愿意消费的用户是从哪里来,有哪些潜在的用户能够挖掘,网站是否存在倒闭风险等。
注:很遗憾,因为商业缘由,没法提供电商网站的日志。这里我取的是某论坛的日志分析,原理都是同样的,指标也相似。
这里Hadoop的项目,咱们采用Maven结构来构建项目,这样可以保证整个项目的清爽,对依赖包可以统一的进行管理,在项目的打包和发布上也是大有裨益。
注:如何建立Maven项目这里不作赘述,能够自行查找相应的资料。
指标咱们已经分析的很明确了,下面咱们来考虑如何实现这些指标,以及实现这些指标须要用到那些技术,下面我画了一个实现的流程图:
因为是在Retina屏下截取的,因此分辨率会有点高,若网络有故障,估计图会展现不了,于是,下面我也用文字描述一下整个流程。
首先咱们须要获取这些日志文件,获取的方式有多种,这里咱们只列出了比较工做中使用的2种方式,少许的日志能够直接使用脚本上传到HDFS,海量日志可使用Flume进行上传到HDFS,而后咱们将上传在HDFS到日志进行清洗(按指标清洗,去掉一些异常数据),将清洗后到数据重定向到新的HDFS目录中,接下来咱们能够按指标来进行统计结果,统计的方式,这里我也列出了工做中使用的2种方式,一种是编写MR任务进行统计,另外一种是使用hive来统计,最后将统计的结果使用sqoop导出到mysql或是oracle中保存(明晰存储在HBase中)。到这里整理工做就算是结束,至于如何使用统计出来的数据,这里不是咱们所考虑的范围。
关于源代码,目前有些部分代码要从源代码中分离出来,到时候我会把这个日志分析系统项目的代码放在Github上,整理完后连接到时候会放在这片博文的下面。另外有什么问题能够加群咨询,或发邮件给我,我会尽我所能给予帮助。与君共勉!