Spark代码练习——CDN日志,SparkCore实现

一、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)
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值