分享

日志分析实战之清洗日志小实例4:统计网站相关信息

问题导读

1.如何统计网站总的点击量?
2.如何实现统计不能访问网页的个数?
3.文章中如何定义和使用Scala函数的?





上一篇
about云日志分析实战之清洗日志3:如何在spark shell中导入自定义包
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22881


上一篇,我们已经添加了清洗日志的核心代码,那么剩下的我们就可以统计相关信息,比如最简单的找到不能访问的网页。

导入之后,我们创建AccessLogParser实例[mw_shl_code=bash,true]val p = new AccessLogParser
[/mw_shl_code]这个很重要,在后面我们会用到
首先我们需要加载一部分日志样例。
[mw_shl_code=bash,true]192.168.169.50 - - [17/Feb/2012:10:09:13 +0800] "GET /favicon.ico HTTP/1.1" 404 288 "-" "360se"
192.168.169.50 - - [17/Feb/2012:10:36:26 +0800] "GET / HTTP/1.1" 403 5043 "-" "Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0"
192.168.169.50 - - [17/Feb/2012:10:36:26 +0800] "GET /icons/powered_by_rh.png HTTP/1.1" 200 1213 "http://192.168.55.230/" "Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0"
192.168.169.50 - - [17/Feb/2012:10:09:10 +0800] "GET /icons/powered_by_rh.png HTTP/1.1" 200 1213 "http://192.168.55.230/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; 360SE)"
192.168.55.230 - - [24/Feb/2012:09:48:58 +0800] "GET /favicon.ico HTTP/1.1" 404 288 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111109 CentOS/3.6-3.el5.centos Firefox/3.6.24"
192.168.169.50 - - [24/Feb/2012:09:45:03 +0800] "GET /server-status HTTP/1.1" 404 290 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; 360SE)"
192.168.55.230 - - [24/Feb/2012:09:49:02 +0800] "GET / HTTP/1.1" 403 5043 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111109 CentOS/3.6-3.el5.centos Firefox/3.6.24"
192.168.55.230 - - [24/Feb/2012:09:49:02 +0800] "GET /icons/apache_pb.gif HTTP/1.1" 200 2326 "http://192.168.55.230/" "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111109 CentOS/3.6-3.el5.centos Firefox/3.6.24"
192.168.55.230 - - [24/Feb/2012:09:49:02 +0800] "GET /icons/powered_by_rh.png HTTP/1.1" 200 1213 "http://192.168.55.230/" "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111109 CentOS/3.6-3.el5.centos Firefox/3.6.24"
192.168.55.230 - - [24/Feb/2012:09:49:20 +0800] "GET /server-status HTTP/1.1" 404 290 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111109 CentOS/3.6-3.el5.centos Firefox/3.6.24"
[/mw_shl_code]
将其保存为aboutyun.log
将其上传到hadoop
[mw_shl_code=bash,true]hadoop fs -put aboutyun.log /[/mw_shl_code]
上传成功验证
验证.jpg

统计网站总的点击量
接着我们加载文件。
[mw_shl_code=bash,true]var log=sc.textFile("/aboutyun.log")
[/mw_shl_code]
这里sc是系统已经初始化的,我们可以直接使用,可以理解为sparkContext的实例
sc读取文件.jpg

加载之后,我们统计行数,也可以理解为统计网站总的点击量。这时候我们就看到总点击量为10
统计行数.jpg


统计网站不能访问网页的数量

首先我们定义一个函数,获取一条记录的httpStatusCode,也就是返回码
[mw_shl_code=scala,true]def getStatusCode(line: Option[AccessLogRecord]) = {
  line match {
    case Some(l) => l.httpStatusCode
    case None => "0"
  }
}[/mw_shl_code]

定义函数.jpg

定义函数之后,我们接着使用
[mw_shl_code=bash,true]log.filter(line => getStatusCode(p.parseRecord(line)) == "404").count
[/mw_shl_code]
上面的p是我们前面定义的对象。
val p = new AccessLogParser,然后调用了parseRecord函数。这些都是jar包的内容。大家可以详细看看。

统计4074.jpg

这样404网页的个数就统计出来了。后面我们可以做一些更加复杂的内容

#################
补充说明
1.在统计日志测试的时候,文件一定标准,否则会统计错误,比如日志要换行

2.函数定义
附上所用函数的相关信息

Option and Either
Option和Either都是用来让返回值可以有两个选择
而Option是比较简单的版本, 两个选择, 一定是成功Some, 和失败None  
Option意味着可能有值some(x), 也可能没有值(用None对象, 表示缺失), 典型的例子就是从字典里取值
[mw_shl_code=scala,true]val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
def show(x: Option[String]) = x match { //Option类型, 可选的String
    case Some(s) => s
    case None => "?"
}
scala> show(capitals get "France")
res24: String = Paris
scala> show(capitals get "North Pole")
res25: String = ?[/mw_shl_code]


以前的方式, 比如Java, 通过null来表示没有取到值, 但是有的时候null可能作为合法值出现, 就需要特殊处理, 很麻烦
而Scala提供option来比较优雅的解决这个问题
Either, 更为通用一些, 可用自己定义两种选择, 直接看个spark源码中的例子,
对于PutResult中的data, 有可能是ByteBuffer或者Iterator
而使用的时候, 使用Left和Right来选择到底用哪一个
[mw_shl_code=scala,true]private[spark] case class PutResult(size: Long, data: Either[Iterator[_], ByteBuffer])

PutResult(sizeEstimate, Left(values.iterator))PutResult(bytes.limit(), Right(bytes.duplicate()))[/mw_shl_code]

这里无论option或either都提高了极好的灵活性, 在Java中如果要返回一个有两种可能性的值就比较不那么优雅了
来自:
http://www.cnblogs.com/fxjwind/p/3338829.html


相关文章:

日志分析实战之清洗日志小实例1:使用spark&Scala分析Apache日志
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22856

日志分析实战之清洗日志小实例2:导入日志清洗代码并打包
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22862


日志分析实战之清洗日志小实例3:如何在spark shell中导入自定义包
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22881



日志分析实战之清洗日志小实例4:统计网站相关信息
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22900


日志分析实战之清洗日志小实例5:实现获取不能访问url
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22911


日志分析实战之清洗日志小实例6:获取uri点击量排序并得到最高的url
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22928


日志分析实战之清洗日志小实例7:查看样本数据,保存统计数据到文件
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22953


链接:http://pan.baidu.com/s/1pKXn8Ob 密码:yndp

本帖被以下淘专辑推荐:

已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条