基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言
基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言
标签: NetFlow
Spark
SparkSQL
本文主要是介绍如何使用Spark做一些简单的NetFlow数据的处理,是基于 IntelliJ IDEA开发Spark 的Maven项目,本文会介绍一些简单的NetFlow基础知识,以及如何在 IntelliJ IDEA 上开发Maven项目,用Scala 写的一些简单的NetFlow字段分析统计的代码,包括 SparkCore和SparkSQL两个版本的。
初步认识NetFlow
在开始写具体的分析代码之前,先要了解NetFlow的基本知识,和它的具体字段都代表什么意思。
我之前的一篇文章里有对于NetFlow的一些简单介绍。
http://www.cnblogs.com/wuyue3427/articles/7680578.html
下面是NetFlow数据和相对应的字段含义(每一行代表一条NetFlow数据)
可以看出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文件粘到这。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MDemo4</groupId>
<artifactId>scm4</artifactId>
<version>1.0-SNAPSHOT</version>
<inceptionYear>2008</inceptionYear>
<properties>
<jackson.version>2.4.2</jackson.version>
<scala.version>2.10.5</scala.version>
<org.slft4j.version>1.6.1</org.slft4j.version>
<spark.version>1.5.2</spark.version>
</properties>
<repositories>
<repository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.specs</groupId>
<artifactId>specs</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
<version>${scala.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.10</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka_2.10</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.10</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.10</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>com.databricks</groupId>
<artifactId>spark-csv_2.10</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slft4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slft4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slft4j.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
<args>
<arg>-target:jvm-1.5</arg>
</args>
</configuration>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
</plugin>
</plugins>
</reporting>
</project>
这个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命令进行打包。
也可以在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包所在的目录
最后运行得到的结果文件如下:
用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中读取数据。
运行结果如下:
总结
本文介绍的都是一些最基本的Spark使用方式,仅适用于入门,欢迎大家一起探讨学习。
基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言的更多相关文章
- 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用
https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...
- Spark记录-SparkSql官方文档中文翻译(部分转载)
1 概述(Overview) Spark SQL是Spark的一个组件,用于结构化数据的计算.Spark SQL提供了一个称为DataFrames的编程抽象,DataFrames可以充当分布式SQL查 ...
- Spark 实践——基于 Spark Streaming 的实时日志分析系统
本文基于<Spark 最佳实践>第6章 Spark 流式计算. 我们知道网站用户访问流量是不间断的,基于网站的访问日志,即 Web log 分析是典型的流式实时计算应用场景.比如百度统计, ...
- Spark系列-SparkSQL实战
Spark系列-初体验(数据准备篇) Spark系列-核心概念 Spark系列-SparkSQL 之前系统的计算大部分都是基于Kettle + Hive的方式,但是因为最近数据暴涨,很多Job的执行时 ...
- hive on spark VS SparkSQL VS hive on tez
http://blog.csdn.net/wtq1993/article/details/52435563 http://blog.csdn.net/yeruby/article/details/51 ...
- 基于Spark的电影推荐系统(推荐系统~2)
第四部分-推荐系统-数据ETL 本模块完成数据清洗,并将清洗后的数据load到Hive数据表里面去 前置准备: spark +hive vim $SPARK_HOME/conf/hive-site.x ...
- 基于Spark的电影推荐系统(推荐系统~7)
基于Spark的电影推荐系统(推荐系统~7) 22/100 发布文章 liuge36 第四部分-推荐系统-实时推荐 本模块基于第4节得到的模型,开始为用户做实时推荐,推荐用户最有可能喜爱的5部电影. ...
- 基于Spark的电影推荐系统(推荐系统~1)
第四部分-推荐系统-项目介绍 行业背景: 快速:Apache Spark以内存计算为核心 通用 :一站式解决各个问题,ADHOC SQL查询,流计算,数据挖掘,图计算 完整的生态圈 只要掌握Spark ...
- 京东基于Spark的风控系统架构实践和技术细节
京东基于Spark的风控系统架构实践和技术细节 时间 2016-06-02 09:36:32 炼数成金 原文 http://www.dataguru.cn/article-9419-1.html ...
随机推荐
- (10.11)Java第一小步
在度过大一和大二浑浑噩噩的咸鱼生活之后,我决定 开始为自己的未来负责,开始学习自己喜欢的Java,同时决定以这篇博客来开启自己的博客之旅和Jaca的学习之路. 以后我也会陆续在博客园更新自己的博客,记 ...
- iOS将自己的框架更新到cocopods上
第一步 把自己的框架更新到github 上,为了提交地址给他人下载.这里就不详细介绍如何把项目更新到github上了 第二步 这个时候我们的项目已经挂在github上了我们需要给本地的项目新建一个Po ...
- 为选择屏幕的字段设置F4帮助
在没有参考 数据元素,域和搜索帮助的情况下,自定义F4 帮助 1,PARAMETERS: p_bukrs(4) TYPE C MATCHCODE OBJECT H_T001. 2,AT SELECTI ...
- AlexNet 网络详解及Tensorflow实现源码
版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 图片数据处理 2. 卷积神经网络 2.1. 卷积层 2.2. 池化层 2.3. 全链层 3. AlexNet 4. 用Tensorflow搭 ...
- UVa 1608,Non-boring sequences
好诡异的一个题啊 紫书上关于从左边找还是从两边往中间找的讨论没有看懂,怎么一下就找到唯一的元素了(⊙_⊙?) 方法就是用的书上讲的方法,类似于uva 11572,不过这个题需要预处理存下两边的最近的相 ...
- [Hdu1342] Lotto
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1342 题目大意:输出6--13从小到大个数,然后按顺序输出6个数,输出所有种可能. 解题思路:这题难度 ...
- 雅虎军规以及Chrome调试
1.尽量减少HTTP请求数 80%的终端用户响应时间都花在了前端上,其中大部分时间都在下载页面上的各种组件:图片,样式表,脚本,Flash等等.减少组件数必然能够减少页面提交的HTTP请求数.这是让页 ...
- JS框架设计读书笔记之-选择器引擎01
选择符 选择符是指CSS样式规则最左边的部分,例如 p{},#id{},.class{},p.class{} 等等 总共可以分为四大类: 并联选择器 => 逗号 => $('div,spa ...
- javascript高性能写法
看到一篇不错的博文,如果想写出比较高性能的代码,可参看这个链接http://developer.51cto.com/art/200906/131335.htm
- code forces 436 D. Make a Permutation!
D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...