基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言

基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言

标签: NetFlow Spark SparkSQL


本文主要是介绍如何使用Spark做一些简单的NetFlow数据的处理,是基于 IntelliJ IDEA开发SparkMaven项目,本文会介绍一些简单的NetFlow基础知识,以及如何在 IntelliJ IDEA 上开发Maven项目,用Scala 写的一些简单的NetFlow字段分析统计的代码,包括 SparkCore和SparkSQL两个版本的。

初步认识NetFlow

在开始写具体的分析代码之前,先要了解NetFlow的基本知识,和它的具体字段都代表什么意思。
我之前的一篇文章里有对于NetFlow的一些简单介绍。
http://blog.csdn.net/u012462093/article/details/78251470#0-qzone-1-66165-d020d2d2a4e8d1a374a433f596ad1440

下面是NetFlow数据和相对应的字段含义(每一行代表一条NetFlow数据)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u8lzVkxQ-1592204881867)(https://i.imgur.com/Wfj5s4M.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7y7fDBkm-1592204881869)(https://i.imgur.com/MqeATZb.png)]

可以看出NetFlow能很清晰的表现出我们需要的信息,方便我们做字段提取和处理。

使用IDEA开发Spark的Maven项目

这也有一篇详细介绍怎么安装IDEA和搭建Maven项目博客
http://blog.csdn.net/kwu_ganymede/article/details/51832427

Maven管理项目在JavaEE普遍使用,开发Spark项目也不例外,因此需要构建Maven-Scala项目来开发Spark项目。本文采用的工具是IntelliJ IDEA 2017,IDEA工具越来越被大家认可,开发java, python ,scala 支持都非常好,而Scala语言是开发Spark项目的首选。

上面那篇博客对如何安装搭建Spark的Maven项目包括安装Scala插件都有非常详细的介绍,这里我就不再过多阐述了。因为我们不光有Spark项目还要用到SparkSql,所以不能用那篇博客中的pom文件,我把我的pom文件粘到这。


4.0.0
MDemo4
scm4
1.0-SNAPSHOT
2008

2.4.2
2.10.5
1.6.1
1.5.2






  scala-tools.org
  Scala-Tools Maven2 Repository
  http://scala-tools.org/repo-releases





  scala-tools.org
  Scala-Tools Maven2 Repository
  http://scala-tools.org/repo-releases





  org.scala-lang
  scala-library
  ${scala.version}




  junit
  junit
  4.4
  test


  org.specs
  specs
  1.2.5
  test


  org.scala-lang
  scala-compiler
  ${scala.version}
  compile



  org.apache.spark
  spark-core_2.10
  ${spark.version}



  org.apache.spark
  spark-streaming_2.10
  ${spark.version}



  org.apache.spark
  spark-streaming-kafka_2.10
  ${spark.version}



  org.apache.spark
  spark-mllib_2.10
  ${spark.version}



  org.apache.spark
  spark-sql_2.10
  ${spark.version}



  com.databricks
  spark-csv_2.10
  1.4.0



  org.slf4j
  slf4j-api
  ${org.slft4j.version}




  org.slf4j
  jcl-over-slf4j
  ${org.slft4j.version}



  org.slf4j
  slf4j-log4j12
  ${org.slft4j.version}



  com.alibaba
  fastjson
  1.2.15




src/main/scala
src/test


  
    org.scala-tools
    maven-scala-plugin
    
      
        
          compile
          testCompile
        
      
    
    
      ${scala.version}
      
        -target:jvm-1.5
      
    
  






  
    org.scala-tools
    maven-scala-plugin
    
      ${scala.version}
    
  



这个pom文件里详细包含了Spark、SparkSQL、SparkStreaming的相关依赖,所以如果要开发其他的Spark项目也基本够用了。

下面就进入正题,怎么用Spark分析NetFlow数据

用Spark根据目的IP统计字节数

测试数据来源:

首先要解决的是数据来源问题,有两个方法,由flowd程序捕获或由flowfake伪造数据,落地形成文件。
本文用的是第二种方式伪造的数据,或者自己写脚本生成数据,但是无论哪种方式最后都要落地形成文件。我们读取数据的方式是从文件中读取。

数据生成之后可以直接只用也可以上传到HDFS中使用,两种方法区别不大。

直接上代码

import org.apache.spark.{SparkConf, SparkContext}    
object SparkDemo1 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("SparkDemo").setMaster("local")
    val sc = new SparkContext(conf)
    val rdd1 = sc.textFile("hdfs:///home/fake/*")
    //按照目的ip统计接受到的包数量
    val rdd2 = rdd1
      .map(m=>{(m.split("\\\t")(2),m.split("\\\t")(6).toInt)})
      .reduceByKey(_+_)
      .sortBy(_._2,false)
      .repartition(1)
    rdd2.saveAsTextFile("hdfs:///home/results")
  }
}

因为是测试,所以用的运行方式是单机运行,也可以换成集群运行。

  • textFile表示从hdfs上获取数据,如果想读本地文件只需要把hdfs换成file即可
  • /*表示的是可以读取该目录下的所有文件
  • netflow数据字段之间是用制表符分割的
  • 在数据量大的情况下回进行默认分区,用repartition(1)可以将结果文件合并成一个,方便查看

提交到Spark系统上运行

首先先用Maven命令将代码打成jar包,IDEA提供了对Maven很好的支持,只用在右侧的Maven Projects栏中即可点击package命令进行打包。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u8eroIO0-1592204881872)(https://i.imgur.com/btXt4jy.png)]

也可以在Terminal窗口中输入命令mvn clean package命令进行打包,打好的jar包会存放在target文件夹下。

将jar包上传到Spark所在的系统中使用Spark的submit方式进行运行。

spark-submit --queue flow \
	--class fake.SparkDemo1 \
/home/scm4-1.0-SNAPSHOT.jar

第二行指定的是main函数所在的路径,最后一行指定的是jar包所在的目录

最后运行得到的结果文件如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zl2Gy2Fi-1592204881875)(https://i.imgur.com/58fn8se.png)]

用SparkSQL进行多字段分组聚合查询

老规矩,先上代码

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql._    
object SparkDemo3 {
  def main(args: Array[String]): Unit = {
    val conf=new SparkConf().setAppName("SparkDemo").setMaster("local")
    val sc=new SparkContext(conf)
    val sqlc=new SQLContext(sc)
    import sqlc.implicits._
    //选择日期,源ip,目的ip,字节4个字段,并做分组流量查询
    sc.textFile("hdfs:///home/fake/*")
      .map(x=>{(x.split("\\\t")(8),x.split("\\\t")(0),x.split("\\\t")(1),x.split("\\\t")(7))})
      .repartition(1)
      .toDF("time","rip","sip","bytes").registerTempTable("temp")
    sqlc.sql("select max(time), rip, sip, sum(bytes) as bytes from temp group by rip, sip order by bytes desc limit 10")
      .toJavaRDD
      .saveAsTextFile("hdfs:///home/results")

  }

}
  • 因为是直接从文件中读取数据,所以需要先读成RDD再转换成DataFream,最后写出文件之前还要再转回RDD。在本文中仅做测试,真实环境中一般是从hive中读取数据。

运行结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PXbXqEoF-1592204881877)(https://i.imgur.com/gIaFemK.png)]

总结

本文介绍的都是一些最基本的Spark使用方式,仅适用于入门,欢迎大家一起探讨学习。
其他相关资料已经同步到我的博客网站,欢迎访问我的个人博客了解更多内容。

你可能感兴趣的:(spark,scala,spark,idea,intellij,idea,sparksql)