038 spark中使用sparksql对日志进行分析(属于小案例)
一:使用sparksql开发
1.sparksql开发的两种方式
HQL:SQL语句开发
eq : sqlContext.sql("xxxx")
DSL : sparkSql中DataFrame的API调用方式
eq:val df=sqlContext.xxx
df.select("number")
二:HQL的开发案例
1.新建目录上传日志

2.开启服务

三:书写程序
1.描述
这个程序一共包括两个部分。
所以写的是两个程序。
2.程序一:对日志的描述--ApacheAccessLog
package com.ibeifeng.bigdata.spark.log import scala.util.matching.Regex /**
* 64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
* Created by ibf on 01/15.
*/
case class ApacheAccessLog(
ipAddress: String, // IP地址
clientId: String, // 客户端唯一标识符
userId: String, // 用户唯一标识符
serverTime: String, // 服务器时间
method: String, // 请求类型/方式
endpoint: String, // 请求的资源
protocol: String, // 请求的协议名称
responseCode: Int, // 请求返回值:比如:200、401
contentSize: Long // 返回的结果数据大小
) /**
* 64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
* Created by ibf on 01/15.
* 提供一些操作Apache Log的工具类供SparkCore使用
*/
object ApacheAccessLog {
// Apache日志的正则
val PARTTERN: Regex =
"""^(\S+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (\S+) (\S+)" (\d{3}) (\d+)""".r /**
* 验证一下输入的数据是否符合给定的日志正则,如果符合返回true;否则返回false
*
* @param line
* @return
*/
def isValidateLogLine(line: String): Boolean = {
val options = PARTTERN.findFirstMatchIn(line) if (options.isEmpty) {
false
} else {
true
}
} /**
* 解析输入的日志数据
*
* @param line
* @return
*/
def parseLogLine(line: String): ApacheAccessLog = {
if (!isValidateLogLine(line)) {
throw new IllegalArgumentException("参数格式异常")
} // 从line中获取匹配的数据
val options = PARTTERN.findFirstMatchIn(line) // 获取matcher
val matcher = options.get // 构建返回值
ApacheAccessLog(
matcher.group(1), // 获取匹配字符串中第一个小括号中的值
matcher.group(2),
matcher.group(3),
matcher.group(4),
matcher.group(5),
matcher.group(6),
matcher.group(7),
matcher.group(8).toInt,
matcher.group(9).toLong
)
}
}
3.程序二:针对需求进行--LogAnalysis
package com.ibeifeng.bigdata.spark.log import com.ibeifeng.bigdata.spark.core.ApacheAccessLog
import org.apache.spark.sql.{DataFrame, SQLContext}
import org.apache.spark.{SparkContext, SparkConf}
/**
* Created by Administrator on 2017/4/25.
*/
object LogAnalysis {
def main(args: Array[String]):Unit={
//sqlContext
val conf=new SparkConf()
.setMaster("local[*]")
.setAppName("log-analysis-sparksql")
val sc=SparkContext.getOrCreate(conf)
val sqlContext=new SQLContext(sc)
import sqlContext.implicits._ //如果不写,下面的转换不成功 //transform
val path="/spark/logs/input"
val rdd=sc.textFile(path)
val apacheAccessDataFrame=rdd
.filter(line=>ApacheAccessLog.isValidateLogLine(line))
.map(line => {
ApacheAccessLog.parseLogLine(line)
}).toDF() //rdd转换为DataFrame //register temptable
apacheAccessDataFrame.registerTempTable("log_analysis_temp_table")
sqlContext.sql("select * from log_analysis_temp_table limit 1").show() //需求一:求contentSize的平均值,最大值以及最小值
val resultDataFrame1=sqlContext.sql(
"""
|SELECT
|AVG(contentSize) as avg_contentSize,
|MAX(contentSize) as max_contentSize,
|MIN(contentSize) as min_contentSize
|FROM log_analysis_temp_table
""".stripMargin)
resultDataFrame1.show() //save //save as HDFS
val resultRdd=resultDataFrame1.map(row=>{
val avgSize=row.getAs[Double]("avg_contentSize")
val minSize=row.getAs[Long]("min_contentSize")
val maxSize=row.getAs[Long]("max_contentSize")
(avgSize,minSize,maxSize)
})
resultRdd.saveAsTextFile(s"/spark/logs/output/sql_${System.currentTimeMillis()}") //需求二:求各个返回值出现的数据个数
val resultDataFrame2=sqlContext.sql(
"""
|SELECT
|responseCode AS code,
|COUNT(1) AS count
|FROM log_analysis_temp_table
|GROUP BY responseCode
""".stripMargin
)
resultDataFrame2.show() //需求三:求访问次数大于N的IP地址,并对黑名单进行限制
val blackIP=Array("200-55-104-193.ds1.prima.net.ar","10.0.0.153","208-38-57-205.ip.cal.radiant.net")
val N=10
val resultDataFrame3=sqlContext.sql(
s"""
|SELECT
|ipAddress AS ip,
|COUNT(1) AS count
|FROM log_analysis_temp_table
|WHERE not(ipAddress in(${blackIP.map(ip=>s"'${ip}'").mkString(",")}))
|GROUP BY ipAddress
|HAVING count>${N}
""".stripMargin)
resultDataFrame3.show() //需求四:求访问次数最多的前k个endpoint的值
val k=10
val resultDataFrame4=sqlContext.sql(
s"""
|SELECT
| t.endpoint,
| t.count
|FROM(
|SELECT
| endpoint,
| COUNT(1) AS count
|FROM log_analysis_temp_table
|GROUP BY endpoint) t
|ORDER BY t.count DESC
|limit ${k}
""".stripMargin)
resultDataFrame4.show()
}
}
4.运行结果





038 spark中使用sparksql对日志进行分析(属于小案例)的更多相关文章
- 关于Spark中RDD的设计的一些分析
RDD, Resilient Distributed Dataset,弹性分布式数据集, 是Spark的核心概念. 对于RDD的原理性的知识,可以参阅Resilient Distributed Dat ...
- spark读取 kafka nginx网站日志消息 并写入HDFS中(转)
原文链接:spark读取 kafka nginx网站日志消息 并写入HDFS中 spark 版本为1.0 kafka 版本为0.8 首先来看看kafka的架构图 详细了解请参考官方 我这边有三台机器用 ...
- 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件
这个大坑... .... 如题,在Windows的eclipse中编写SparkSQL代码时,编写如下代码时,一运行就抛出一堆空指针异常: // 首先还是创建SparkConf SparkConf c ...
- Spark中的编程模型
1. Spark中的基本概念 Application:基于Spark的用户程序,包含了一个driver program和集群中多个executor. Driver Program:运行Applicat ...
- 【原】 Spark中Task的提交源码解读
版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Stage的提交 http://www.cnblogs.com/yourarebest/p/5356769.html Spark中 ...
- Spark中的键值对操作-scala
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Spark中的键值对操作
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- 【原创】大叔问题定位分享(11)Spark中对大表子查询加limit为什么会报Broadcast超时错误
当两个表需要join时,如果一个是大表,一个是小表,正常的map-reduce流程需要shuffle,这会导致大表数据在节点间网络传输,常见的优化方式是将小表读到内存中并广播到大表处理,避免shuff ...
- 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用
https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...
随机推荐
- luogu1373 小a和uim之大逃离 (dp)
直接设f[i][j][k][l][2]是在(i,j)时两人分数是k,l,复杂度会爆掉 但其实只需要知道两人分数只差就行了 所以设f[i][j][k][2],k是分数之差%(K+1),最后一位表示该谁走 ...
- nowcoder106I Neat Tree (单调栈)
Richard神犇出给nowcoder的题 用单调栈找到每个点它向右和向左的第一个大于或小于它的位置,然后它作为最大值/最小值的区间就要在这个范围里,那么它的贡献就是这个区间长度乘一乘再减一减 注意一 ...
- 高阶函数map(),filter(),reduce()
接受函数作为参数,或者把函数作为结果返回的函数是高阶函数,官方叫做 Higher-order functions. map()和filter()是内置函数.在python3中,reduce()已不再是 ...
- Oracle 11g DRCP配置与使用
Oracle 11g DRCP配置与使用Oracle 11g推出了驻留连接池(Database Resident Connection Pool)特性,提供了数据库层面上的连接池管理机制,为应对高并发 ...
- Python基础学习(三)
了解了Python的基础使用,接下来继续练手廖雪峰老师的教学案例. 一.变量可以指向函数 说明,一个函数可以赋值给一个变量,该变量就会具有该函数的功能,举例: gg = abs print( gg(- ...
- 织梦dedecms搜索页加上序列号autoindex
在我们做织梦搜索页模板的时候经常会使用到autoindex标签.那么怎么才能实现搜索页可以使用呢?下面给大家分享下解决方法: 打开文件:include/arc.searchview.class.php ...
- java回顾(项目前期的基本准备)
一. 基础回顾 1 集合 1.1 集合的类型与各自的特性 ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查 ...
- python实现windows Service服务程序
python实现windows Service服务程序 win32serviceutil.ServiceFramework是封装得很好的Windows服务框架,本文通过继承它来实现. 通过SvcDoR ...
- js判断当前页面是顶级窗口
<script> if(top.location!=self.location){ alert("不是顶层窗口"); }else{ alert("是顶层窗口& ...
- 情人节网站logo赏析
一年一度的情人节,不少网站都进行了不错的装点,我们不妨来简单浏览一下,借以触发灵感. 百度 百度的logo放上了改变,变成了一个gif,图片如下. 腾讯 淘宝 淘宝的logo同样换成了一个gif 谷歌 ...