使用 Spark 进行流量日志分析

说明:文章所有内容截选自实验楼教程【使用 Spark 进行流量日志分析】~

一、实验介绍

1.1 实验内容

日志在计算机系统中是一个非常广泛的概念,任何程序都有可能输出日志:操作系统内核、各种应用服务器等等。日志包含很多有用的信息,例如访问者的 IP、访问的时间、访问的目标网页、来源的地址以及访问者所使用的客户端的 UserAgent 信息等,分析日志能帮助企业营销做出决策,本节课将介绍如何用 Spark 分析日志。

1.2 先学课程

Spark 系列课程

1.3 实验知识点

  • 二次排序
  • 序列化
  • Spark RDD

1.4 实验环境

  • spark-1.5.1-bin-hadoop2.6

  • Xfce 终端

1.5 适合人群

本课程属于中级难度级别,适合具有 Spark 基础的用户,如果对 Scala 熟悉 ,能够更好的上手本课程。

二、实验步骤

2.1 日志格式简介

随着互联网的发展,产生了大量的 Web 日志,日志包含了用户最重要的信息,通过日志分析,用户可以获取到网站或应用的访问量,哪个网页访问人数最多,哪个网页有价值等。一般中型的网站(10万的PV),每天会产生1GB 以上的 Web 日志文件,大型的网站,可能每天产生 500G 及以上的数据量。常见的日志格式主要有两类:一种是 Apache 的 NCSA 格式,另一种是 IIS 的 W3C 格式。对于日志的这种规模的数据,通过 Spark 进行分析与处理,能够达到很好的效果。

一种 Nginx 日志格式举例。
注意:这是一条数据,即一行数据,包含29个字段。

1368607178148   1368607184454   10.80.102.29    10.80.102.29    49273                   GET 113.31.42.4 80  360安全卫士 工具软件    安全杀毒    http://cdn.weather.hao.360.cn/sed_api_weather_info.php?code=101290101&v=2&param=weather&app=hao360&_jsonp=__jsonp1__&t=2281012  cdn.weather.hao.360.cn  360安全中心 互联网 信息安全    奇虎360   4   3   909 192 200 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) 2   1368607178245

日志各字段说明如下:

《使用 Spark 进行流量日志分析》 此处输入图片的描述

部分分析日志指标如下:
PV(Page View): 网站页面访问数。
UV(Page View): 页面IP的访问量统计,即独立IP。
PVPU(Page View Per User):平均每位用户访问页面数。
Time: 用户每小时PV的统计。
Source: 用户来源域名的统计。

Browser: 用户的访问设备统计。
.....

如上图所示,数据字段太多,我们抽取黄色的字段,汇总如下,您可以学习 linux 操作工具进行过滤,限于篇幅,在此不作介绍。

《使用 Spark 进行流量日志分析》 此处输入图片的描述

过滤后的部分数据如下(选取其中一条仅作示例):

1363157986072   18320173382 84-25-DB-4F-10-1A:CMCC-EASY 120.196.100.99  input.shouji.sogou.com  搜索引擎    21  18  9531    2412    200


继续抽取上图红色框里的数据,作为本节课实验数据,各字段之间用 \t分隔符分开,最终数据如下所示:

1493901764492   13326854564 16193   4743
1493910704492   13426854534 73434   2809
1493888804492   13626854565 81858   15477
1493909204492   13726854561 30144   3965
1493900564492   13926854564 79050   56108
1493887604492   13826854534 96411   4914
1493884124492   13726854569 37707   55218
1493909504493   13226854545 98537   8529
1493909744493   13526854569 44872   99132
1493887364493   13626854545 88181   57680
1493898884493   13526854555 37478   7935
1493899784493   13532434342 27011   88622
1493884064493   13776854556 69130   14111
1493909444493   13426854544 9424    7944
1493881124493   13726455555 60670   9896
1493888144495   13026854539 90589   20091
1493878244495   13245546774 10157   70072
1493890424495   13685456946 54542   92281
1493886644496   13656853434 78754   6029
1493898584496   13026832435 28938   57137
1493895164496   13026854539 13804   45769
1493883644496   13026324344 64352   8799
1493896064496   13368545391 96531   57707
1493883464496   13026855696 50270   51114
1493876624496   13435545456 42725   7474
1493895764496   13434354354 1292    44650
1493906624496   13324234355 36891   66919
1493881244496   13554654765 33422   3859
1493894684496   13734546757 18356   95838
1493894564496   13335435466 40851   54767
1493900864496   13432436546 52265   9739
1493907224497   13943354354 83598   77744
1493895044497   13677878785 1493    71046
1493904044497   13826852343 8337    10934
1493881724497   13026854539 60948   1681
1493887964497   13626854564 52019   92273
1493901164497   13026854534 84997   36689
1493889164497   13232435435 99434   16073
1493888504497   13534543546 15049   2980
1493910284497   13434343444 37073   191
1493891024497   13789654643 6593    93537
1493880044497   13212432434 39299   49042
1493902484497   13226854569 41811   42073
1493890124498   13435435646 9565    69941
1493905724498   14324354354 69444   72664
1493899724498   13743543546 82207   11035
1493904884498   13726854523 34207   32098
1493885624498   13324325434 12683   2862
1493909864498   13026854539 11500   9944
1493893484498   13776854556 77444   5137

其中第一列为reportTime(报告时间戳),
其中第二列为phoneNum(手机号,上图中为msisdn,这里修改为phoneNum,方便识别),
其中第三列为upPayLoad(上行流量),
其中第四列为downPayLoad(下行流量)。

为了操作方便,数据集已上传实验楼,您可以使用以下命令下载。

cd /opt/
sudo  wget http://labfile.oss.aliyuncs.com/courses/825/access_20170504.log

2.2 需求分析

需求描述:对文本中数据记录进行排序,排序规则如下:
phoneNum为基准,分别按照 upPayLoaddownPayLoadreportTime进行降序排序,即先按照upPayLoad排序,如果upPayLoad相同,再比较downPayLoad,如果downPayLoad相同,再比较reportTime,最后选择前6条记录输出。

核心编程思想描述:
所谓二次排序就是排序的时候,考虑两个维度。有一个纬度相同的时候,考虑另外一个维度。首先,将需要将待排序的字段封装成一个类,该实现了Serializable 接口,实现接口中的方法。同时为待排序的属性字段提供getter 、setter 、hashcode 以及 equals 方法。在application 应用程序中 将 key 封装为之前我们定义好的对象,之后调用 sortedByKey() 方法进行排序。

具体实现步骤:
第一步:按照 Serrializable 接口实现自定义排序的 Key
第二步:将要进行二次排序的文件加载进来生成 key-value 类型的 RDD
第三步:使用 sortByKey 基于自定义的 Key 进行二次排序
第四步:去除掉排序的 key,只保留排序结果

2.3 准备工作

1). 环境准备

双击打开桌面上的 Xfce 终端,用 sudo 命令切换到 hadoop 用户,hadoop 用户密码为 hadoop,用 cd 命令进入 /opt 目录,因为用的本地的环境,可以不用启动任何进程也可以完成本节实验。

$ su hadoop
$ cd /opt/
$ jps

《使用 Spark 进行流量日志分析》 此处输入图片的描述

2 准备数据

$ sudo vi access_20170504.log
#添加上述数据,保存
$ more access_20170504.log


《使用 Spark 进行流量日志分析》 此处输入图片的描述

2.3 代码实现

1)创建 maven 项目

2)编写代码

关于以上的代码实现过程,由于篇幅有限,想要查看完整内容,点击【使用 Spark 进行流量日志分析】~

三、实验总结

本节课简单介绍了日志的分类,然后从日志不断简化数据,最终只留下4 个字段,然后以手机号标准,分别按照,上行流量,下行流量,报告时间戳进行倒序排序, 希望学完本节课,能帮助您理解学会运用 Spark 去处理复杂日志分析。

四、参考阅读

    原文作者:实验楼
    原文地址: https://www.jianshu.com/p/8d8485a2d015
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞