数据大致内容及格式

194.237.142.21 - - [18/Sep/2013:06:49:18 +0000] "GET /wp-content/uploads/2013/07/rstudio-git3.png HTTP/1.1" 304 0 "-" "Mozilla/4.0 (compatible;)"
183.49.46.228 - - [18/Sep/2013:06:49:23 +0000] "-" 400 0 "-" "-"
163.177.71.12 - - [18/Sep/2013:06:49:33 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0"
163.177.71.12 - - [18/Sep/2013:06:49:36 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0"
101.226.68.137 - - [18/Sep/2013:06:49:42 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0"
101.226.68.137 - - [18/Sep/2013:06:49:45 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0"
60.208.6.156 - - [18/Sep/2013:06:49:48 +0000] "GET /wp-content/uploads/2013/07/rcassandra.png HTTP/1.0" 200 185524 "http://cos.name/category/software/packages/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
222.68.172.190 - - [18/Sep/2013:06:49:57 +0000] "GET /images/my.jpg HTTP/1.1" 200 19939 "http://www.angularjs.cn/A00n" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
……
……

统计PV(PageViews)

就是统计日志文件中有多少条数据

关于点击流日志的各种指标可以查看【Hadoop离线基础总结】网站流量日志数据分析系统

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext} object PvCount {
def main(args: Array[String]): Unit = { //获取SparkConf
val sparkConf = new SparkConf().setMaster("local[2]").setAppName("PV-Count").set("spark.driver.host", "localhost")
//创建SparkContext
val sparkContext = new SparkContext(sparkConf)
//读取文件
val fileRDD: RDD[String] = sparkContext.textFile("/Users/zhaozhuang/Desktop/4、Spark/Spark第二天/第二天教案/资料/运营商日志/access.log")
//统计数量
val count = fileRDD.count() println("一共有"+count+"行数据") sparkContext.stop()
}
}

经统计后得出,数据有 14619条,也就是说PV量为14619


统计UV(Unique Visitor)

实际工作中,一般推荐用cookie而不是IP地址来对UV进行统计,但这里数据只有IP地址,所以目前就按IP算

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext} object UvCount {
def main(args: Array[String]): Unit = {
//获取SparkConf
val sparkConf = new SparkConf().setAppName("UV-Count").setMaster("local[2]").set("spark.driver.host","localhost")
//创建SparkContext
val sparkContext = new SparkContext(sparkConf)
//筛选日志
sparkContext.setLogLevel("WARN")
//读取文件
val fileRDD: RDD[String] = sparkContext.textFile("/Users/zhaozhuang/Desktop/4、Spark/Spark第二天/第二天教案/资料/运营商日志/access.log")
//从所有数据中剔除掉不需要的数据,只拿到IP地址
val getIpRDD: RDD[String] = fileRDD.map(_.split(" ")(0))
//对IP地址进行去重,去重后数据减少,就可以将分区缩减为1个
val distinctedRDD: RDD[String] = getIpRDD.distinct(1)
//对去重后的数据进行计数统计
val count: Long = distinctedRDD.count() println(count) sparkContext.stop()
}
}

统计得出UV量为1050


求取TopN

有两种方法可以用,take()top() 都可以

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext} object GetTopN {
def main(args: Array[String]): Unit = {
//获取SparkConf
val sparkConf = new SparkConf().setMaster("local[2]").set("spark.driver.host", "localhost").setAppName("getTopN")
//获取SparkContext
val sparkContext: SparkContext = new SparkContext(sparkConf)
//读取文件
val fileRDD: RDD[String] = sparkContext.textFile("/Users/zhaozhuang/Desktop/4、Spark/Spark第二天/第二天教案/资料/运营商日志/access.log")
//筛选日志
sparkContext.setLogLevel("WARN") //194.237.142.21 - - [18/Sep/2013:06:49:18 +0000] "GET /wp-content/uploads/2013/07/rstudio-git3.png HTTP/1.1" 304 0 "-" "Mozilla/4.0 (compatible;)"
//以上是数据格式,首先对数据进行切割
val valueRDD: RDD[Array[String]] = fileRDD.map(x => x.split(" "))
/*
数据切割后的形式
194.237.142.21
-
-
[18/Sep/2013:06:49:18
+0000]
"GET
/wp-content/uploads/2013/07/rstudio-git3.png
HTTP/1.1"
304
0
"-"
"Mozilla/4.0
(compatible;)"
*/
//日志数据中,下标为10的数据为我们要求取的数据(http_refer),所以切割后数组中少于10条的为无效数据
//先将无效数据过滤掉
val filterRDD: RDD[Array[String]] = valueRDD.filter(arr => arr.length > 10)
//获取每一个http_refer的url,并计作一次
val urlAndOne: RDD[(String, Int)] = filterRDD.map(x => (x(10), 1))
//将url相同的次数相加
val reduceRDD: RDD[(String, Int)] = urlAndOne.reduceByKey(_ + _)
//将拿到的url+次数进行排序,false为降序,不填或true为升序
val sortRDD: RDD[(String, Int)] = reduceRDD.sortBy(x => x._2, false)
//求取TopN,两种方法take(N)或者top(N)
val topRDD: Array[(String, Int)] = sortRDD.take(10) println(topRDD.toBuffer)
sparkContext.stop()
}
}

拿到控制台结果为:

ArrayBuffer(("-",5205), (“http://blog.fens.me/category/hadoop-action/”,547), (“http://blog.fens.me/”,377), (“http://blog.fens.me/wp-admin/post.php?post=2445&action=edit&message=10”,360), (“http://blog.fens.me/r-json-rjson/”,274), (“http://blog.fens.me/angularjs-webstorm-ide/”,271), (“http://blog.fens.me/wp-content/themes/silesia/style.css”,228), (“http://blog.fens.me/nodejs-express3/”,198), (“http://blog.fens.me/hadoop-mahout-roadmap/”,182), (“http://blog.fens.me/vps-ip-dns/”,176))

【Spark】通过Spark实现点击流日志分析的更多相关文章

  1. 大数据学习——点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上

    点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上 1需求说明 点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上 2需求分 ...

  2. 基于Kafka+Spark Streaming+HBase实时点击流案例

    背景 Kafka实时记录从数据采集工具Flume或业务系统实时接口收集数据,并作为消息缓冲组件为上游实时计算框架提供可靠数据支撑,Spark 1.3版本后支持两种整合Kafka机制(Receiver- ...

  3. 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用

    https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...

  4. Spark 实践——基于 Spark Streaming 的实时日志分析系统

    本文基于<Spark 最佳实践>第6章 Spark 流式计算. 我们知道网站用户访问流量是不间断的,基于网站的访问日志,即 Web log 分析是典型的流式实时计算应用场景.比如百度统计, ...

  5. .Spark Streaming(上)--实时流计算Spark Streaming原理介

    Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍 http://www.cnblogs.com/shishanyuan/p/474 ...

  6. spark提交异常日志分析

    java.lang.NoSuchMethodError: org.apache.spark.sql.SQLContext.sql(Ljava/lang/String;)Lorg/apache/spar ...

  7. Spark Streaming揭秘 Day31 集群模式下SparkStreaming日志分析(续)

    Spark Streaming揭秘 Day31 集群模式下SparkStreaming日志分析(续) 今天延续昨天的内容,主要对为什么一个处理会分解成多个Job执行进行解析. 让我们跟踪下Job调用过 ...

  8. Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析

    Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28 ...

  9. 024 关于spark中日志分析案例

    1.四个需求 需求一:求contentsize的平均值.最小值.最大值 需求二:请各个不同返回值的出现的数据 ===> wordCount程序 需求三:获取访问次数超过N次的IP地址 需求四:获 ...

随机推荐

  1. WinForm:API

    一.WndProc:  主要用在拦截并处理系统消息和自定义消息 比如:windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息.这个函数就是默认的消息处理函数.你可以重载这个函数来制定自 ...

  2. Daily Scrum 1/14/2016

    Zhaoyang & Yandong: Still optimizing the speech input interface Dong & Fuchen: Image asynchr ...

  3. Serval and Parenthesis Sequence CodeForces - 1153C

    题目大意:一个字符串只含有? ( ),?可以变成 ) 或者 ( ,将字符串中所有的?变成) 或者 ( 使得字符串合法. 合法就是让括号配对,并且不可以提前结束比如:()()这样是不合法的. 题解:既然 ...

  4. A - Engines Atcoder 4900

    题目大意:n个点,任意几个点组合后得到的点距离原点的最远距离. 题解:极角排序:https://blog.csdn.net/qq_39942341/article/details/79840394 利 ...

  5. 关于树的重心--POJ 1655

    树的重心的定义: 在一棵树中,找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 通俗来说就是以这个点为根节点,找到他最大的衣蛾子树,然后 ...

  6. [Abp vNext 入坑分享] - 2.简化项目结构

    一.简要说明 本篇文章根据我自己的需要对项目结果进行简化,让项目结构更符合我自己的要求,同时让项目跑起来.仅供参考 二.具体步骤 2.1卸载掉对我来说目前使用不上的项目,identityserver, ...

  7. PHP反序列化漏洞总结

    写在前边 做了不少PHP反序列化的题了,是时候把坑给填上了.参考了一些大佬们的博客,自己再做一下总结 1.面向对象 2.PHP序列化和反序列化 3.PHP反序列化漏洞实例 1.面向对象 在了解序列化和 ...

  8. 挑战全网最幽默的Vuex系列教程:第五讲 Vuex的小帮手

    先说两句 前面已经讲完了 Vuex 下的 State.Getter.Mutation 及 Action 这四驾马车,不知道大家是否已经理解.当然,要想真正熟练掌握的话,还是需要不断的练习和动手实践才行 ...

  9. css3 文本控制自动换行

    text-overflow:ellipsis; white-space:nowrap; overflow:hidden;

  10. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...