sparklinux服务器日志信息,日志分析实战之清洗日志小实例4:统计网站相关信息...

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

问题导读

1.如何统计网站总的点击量?

2.如何实现统计不能访问网页的个数?

3.文章中如何定义和使用Scala函数的?

上一篇

about云日志分析实战之清洗日志3:如何在spark shell中导入自定义包

http://www.aboutyun.com/forum.php?mod=viewthread&tid=22881

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

导入之后,我们创建AccessLogParser实例

?

1

val p = new AccessLogParser

这个很重要,在后面我们会用到

首先我们需要加载一部分日志样例。

?

01

02

03

04

05

06

07

08

09

10

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"

将其保存为aboutyun.log

将其上传到hadoop

?

1

hadoop fs -put aboutyun.log /

上传成功验证

8ba77b2032f8663283114b56556fe49e.png

统计网站总的点击量

接着我们加载文件。

?

1

var log=sc.textFile( "/aboutyun.log" )

这里sc是系统已经初始化的,我们可以直接使用,可以理解为sparkContext的实例

d8fdaf143c3411122a05b77d9c05e2c2.png

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

3b210b91aea767decad1b3c96eadbc41.png

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

首先我们定义一个函数,获取一条记录的httpStatusCode,也就是返回码

?

1

2

3

4

5

6

def getStatusCode(line : Option[AccessLogRecord]) = {

line match {

case Some(l) = > l.httpStatusCode

case None = > "0"

}

}

b3e3213b692ba24c776005e1098bbc4d.png

定义函数之后,我们接着使用

?

1

log.filter(line => getStatusCode(p.parseRecord(line)) == "404" ).count

上面的p是我们前面定义的对象。

val p = new AccessLogParser,然后调用了parseRecord函数。这些都是jar包的内容。大家可以详细看看。

119f0b1c6cb0c5f520d8e560ac76ff70.png

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

#################

补充说明

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

2.函数定义

附上所用函数的相关信息

Option and Either

Option和Either都是用来让返回值可以有两个选择

而Option是比较简单的版本, 两个选择, 一定是成功Some, 和失败None

Option意味着可能有值some(x), 也可能没有值(用None对象, 表示缺失), 典型的例子就是从字典里取值

?

1

2

3

4

5

6

7

8

9

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" )

res 24 : String = Paris

scala> show(capitals get "North Pole" )

res 25 : String = ?

以前的方式, 比如Java, 通过null来表示没有取到值, 但是有的时候null可能作为合法值出现, 就需要特殊处理, 很麻烦

而Scala提供option来比较优雅的解决这个问题

Either, 更为通用一些, 可用自己定义两种选择, 直接看个spark源码中的例子,

对于PutResult中的data, 有可能是ByteBuffer或者Iterator

而使用的时候, 使用Left和Right来选择到底用哪一个

?

1

2

3

private [spark] case class PutResult(size : Long, data : Either[Iterator[ _ ], ByteBuffer])

PutResult(sizeEstimate, Left(values.iterator))PutResult(bytes.limit(), Right(bytes.duplicate()))

这里无论option或either都提高了极好的灵活性, 在Java中如果要返回一个有两种可能性的值就比较不那么优雅了

来自:

http://www.cnblogs.com/fxjwind/p/3338829.html返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值