一、CDN日志练习:
日志格式为:
IP 命中率(Hit/Miss) 响应时间 请求时间 请求方法 请求URL 请求协议 状态吗 响应大小 referer 用户代理
100.79.121.48 HIT 33 [15/Feb/2017:00:00:46 +0800] "GET http://cdn.v.abc.com.cn/videojs/video.js HTTP/1.1" 200 174055 "http://www.abc.com.cn/" "Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1;+Trident/4.0;)"
IP 命中率(Hit/Miss) 响应时间 请求时间 请求方法 请求URL 请求协议 状态吗 响应大小 referer 用户代理
PV(page view):即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标
uv(unique visitor):指访问某个站点或点击某条新闻的不同IP地址的人数。
统计需求:
1.计算独立IP数、访问最多的十个ip
2.统计每个视频独立IP数
3.统计一天中每个小时的流量
有时我想知道网站每小时视频的观看流量,看看用户都喜欢在什么时间段过来看视频
效果:
统计独立IP访问量前10位:
(114.55.227.102,9348)
(220.191.255.197,2640)
(115.236.173.94,2476)
(183.129.221.102,2187)
(112.53.73.66,1794)
(115.236.173.95,1650)
(220.191.254.129,1278)
(218.88.25.200,751)
(183.129.221.104,569)
(115.236.173.93,529)
独立IP数:43649
统计每个视频独立IP数:(取了前10条数据展示)
视频:141081.mp4 独立IP数:2393
视频:140995.mp4 独立IP数:2050
视频:141027.mp4 独立IP数:1784
视频:141090.mp4 独立IP数:1702
视频:141032.mp4 独立IP数:1528
视频:89973.mp4 独立IP数:1523
视频:141080.mp4 独立IP数:1425
视频:141035.mp4 独立IP数:1321
视频:141082.mp4 独立IP数:1272
视频:140938.mp4 独立IP数:816
统计一天中每个小时间的流量:
00时 CDN流量=14G
01时 CDN流量=3G
02时 CDN流量=5G
03时 CDN流量=3G
04时 CDN流量=3G
05时 CDN流量=4G
06时 CDN流量=11G
07时 CDN流量=22G
08时 CDN流量=43G
09时 CDN流量=52G
10时 CDN流量=61G
11时 CDN流量=45G
12时 CDN流量=46G
13时 CDN流量=51G
14时 CDN流量=55G
15时 CDN流量=45G
16时 CDN流量=45G
17时 CDN流量=44G
18时 CDN流量=45G
19时 CDN流量=51G
20时 CDN流量=55G
21时 CDN流量=53G
22时 CDN流量=42G
23时 CDN流量=25G
初始化环境:
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("CDNTest")
val sc = new SparkContext(conf)
val input = sc.textFile("data/cdn.txt").cache()
// 统计独立IP访问量前10位
ipStatics(input)
//统计每个视频独立IP数
videoIpStatics(input)
// 统计一天中每个小时间的流量
flowOfHour(input)
sc.stop()
}
需求一实现:
// 统计独立IP访问量前10位
def ipStatics(data: RDD[String]): Unit = {
val ipCounts= data.map(x => {
val f = x.split(" ")
f(0)
}).map(x => (x, 1)).
reduceByKey(_ + _).sortBy(_._2,false)
println("共有独立ip数:"+ipCounts.count())
ipCounts.take(10).foreach(println)
}
需求二实现
// 统计每个视频独立IP数
def videoIpStatics(data: RDD[String]): Unit = {
val r1: RDD[(String, String)] = data.map(x => {
val f = x.split(" ")
( f(6), f(0))
})
r1.filter(_._1.endsWith(".mp4"))
.map(x => {
val v = x._1.split("//")(1).split("/")(1)
val ip = x._2
(v, ip)
})
.groupByKey()
.mapValues(x => {
x.toList.distinct.size })
.sortBy(_._2,false)
.take(10)
.foreach(println)
}
需求三实现
//统计一天中每个小时间的流量
def flowOfHour(data: RDD[String]): Unit = {
data.map(x=>{
val f=x.split(" ")
val h= f(3).split(":")(1)
(h,f(9).toLong)
})
.reduceByKey(_+_)
.mapValues(x=>x/1024/1024/1024+"G")
.sortBy(_._1)
.foreach(println)
}