一:使用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对日志进行分析(属于小案例)的更多相关文章

  1. 关于Spark中RDD的设计的一些分析

    RDD, Resilient Distributed Dataset,弹性分布式数据集, 是Spark的核心概念. 对于RDD的原理性的知识,可以参阅Resilient Distributed Dat ...

  2. spark读取 kafka nginx网站日志消息 并写入HDFS中(转)

    原文链接:spark读取 kafka nginx网站日志消息 并写入HDFS中 spark 版本为1.0 kafka 版本为0.8 首先来看看kafka的架构图 详细了解请参考官方 我这边有三台机器用 ...

  3. 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件

    这个大坑... .... 如题,在Windows的eclipse中编写SparkSQL代码时,编写如下代码时,一运行就抛出一堆空指针异常: // 首先还是创建SparkConf SparkConf c ...

  4. Spark中的编程模型

    1. Spark中的基本概念 Application:基于Spark的用户程序,包含了一个driver program和集群中多个executor. Driver Program:运行Applicat ...

  5. 【原】 Spark中Task的提交源码解读

    版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Stage的提交 http://www.cnblogs.com/yourarebest/p/5356769.html Spark中 ...

  6. Spark中的键值对操作-scala

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  7. Spark中的键值对操作

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  8. 【原创】大叔问题定位分享(11)Spark中对大表子查询加limit为什么会报Broadcast超时错误

    当两个表需要join时,如果一个是大表,一个是小表,正常的map-reduce流程需要shuffle,这会导致大表数据在节点间网络传输,常见的优化方式是将小表读到内存中并广播到大表处理,避免shuff ...

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

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

随机推荐

  1. ModelMap对象的 addAttribute,put两个方法区别

    这个是 源码中 ModelMap的定义 类 public class ModelMap extends LinkedHashMap<String, Object> 说明 ModelMap是 ...

  2. 国内k8s集群部署的几种方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lusyoe/article/details/80217291前言总所周知,由于某种原因,通过官方的方 ...

  3. 英文写作指南——《“compare to”等同“compare with”吗?》

  4. html5 canvas创建阴影

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 【整理】HTML5游戏开发学习笔记(5)- 猜谜游戏

    距上次学习笔记已有一个多月过去了,期间由于新项目赶进度,以致该学习计划给打断,十分惭愧.书本中的第六章的例子相对比较简单.所以很快就完成. 1.预备知识html5中video标签的熟悉 2.实现思路对 ...

  6. [转载]HTML5浏览器测试网站汇总

    http://www.cnblogs.com/javawebsoa/archive/2012/04/19/2458224.html 浏览器支持情况统计 When Can IUse:图表经常更新,展示了 ...

  7. CSS-3 渐变的使用

    CSS3 渐变(gradients)可以让您在两个或多个指定的颜色之间显示平稳的过渡. 以前,您必须使用图像来实现这些效果.但是,通过使用 CSS3 渐变(gradients),您可以减少下载的事件和 ...

  8. [MySQL 5.6] GTID实现、运维变化及存在的bug

    [MySQL 5.6] GTID实现.运维变化及存在的bug http://www.tuicool.com/articles/NjqQju 由于之前没太多深入关注gtid,这里给自己补补课,本文是我看 ...

  9. Android的layout_weight和weightSum

    先看一下weightSum属性的功能描述:定义weight总和的最大值.如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值.把weightSum的定义搁在这里,先去看 ...

  10. CSS font系列

    font-family font-family: Verdana,Helvetica,Arial,"Microsoft YaHei",sans-serif; font-family ...