文章目录
SparkStreaming
1.sparkStreaming的基本介绍
1、什么是Spark Streaming
sparkStreaming是spark当中用于实时处理的一个模块,主要是用于做一些实时处理的功能,类似于storm。
sparkStreaming支持各种各样的数据源,例如kakfa,flume,tcp套接字
2、为什么要学sparkStreaming
主要就是用于做实时处理
3、sparkStreaming与strom对比:
1:编程模型不同 sparkStreaming编程模型使用的是DStream
strom编程模型使用的Spout与Bolt
2:编程语言不同
storm使用的cloujure
spark使用scala语言
3:实时性不太一样:
SparkStreaming的实时性不如storm好
4:数据吞吐量不太一样:
SparkStreaming的数据吞吐量远远高于storm
5:数据驱动模型不一样
strom是以数据为驱动的
sparkStreaming是以时间为驱动的。每隔一段时间去处理一批数据。如果间隔时间足够段,直到时间缩短到0.1s钟。
基本上就可以当做实时处理的框架来使用。
2.Spark Streaming原理与架构
1:原理 只要间隔时间足够段,就可以当做实时处理的框架来使用
2:计算流程
3:sparkStreaming的容错性:可以通过rdd确定lineage血统关系,实现容错性,驱动器的容错
4:sparkStreaming的实时性:最小时间间隔可以达到0.1s
5:sparkStreaming的架构
sparkCore ==> RDD ==> SparkContext
sparkSQL ==> DF/DS ==> SparkSession
SparkStreaming ==> DStream ==> StreamingContext
以数据为驱动的程序实时性更高一点
3.DStream
1.什么是DStream
Discretized Stream是Spark Streaming的基础抽象,代表持续性的数据流和经过各种Spark算子操作后的结果数据流。在内部实现上,
DStream是一系列连续的RDD来表示。每个RDD含有一段时间间隔内的数据。
4.DStream相关操作
1、Transformations on DStreams
2、Output Operations on DStreams
5.DStream操作实战
需求:SparkStreaming接受socket数据,实现单词计数WordCount
第一步:创建maven工程并导入jar包
<properties>
<scala.version>2.11.8</scala.version>
<spark.version>2.2.0</spark.version>
</properties>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${
scala.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${
spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${
spark.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<!-- <verbal>true</verbal>-->
</configuration>
</plugin>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<arg>-dependencyfile</arg>
<arg>${
project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass></mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
第二步:node1服务器安装并启动生产者
首先在linux服务器上用YUM安装nc工具,nc命令是netcat命令的简称,它是用来设置路由器。我们可以利用它向某个端口发送数据。
node1服务器执行以下命令安装socket客户端工具,模拟发送数据
yum -y install nc
第三步:通过netcat工具向指定的端口发送数据
node1服务器执行以下命令,向指定的端口9999发送数据
nc -lk 9999
第四步:开发sparkStreaming程序,统计单词出现的次数
package cn.itcast.sparkStreaming
import org.apache.spark.streaming.dstream.{
DStream, ReceiverInputDStream}
import org.apache.spark.{
SparkConf, SparkContext}
import org.apache.spark.streaming.{
Seconds, StreamingContext}
object SparkStreamingDemo1 {
/**
* 实现实时数据统计,接收socket里面的数据
* @param args
* sparkContext: SparkContext, batchDuration: Duration
*/
def main(args: Array[String]): Unit = {
//数据抽象叫做DStream,数据操作对象StreamingContext
val sparkConf: SparkConf = new SparkConf().setMaster("local[4]").setAppName("streamingFirst")
val sparkContext = new SparkContext(sparkConf)
sparkContext.setLogLevel("WARN")
//获取StreamingContext,设置每隔5s处理一批数据
val streamingContext = new StreamingContext(sparkContext,Seconds(5))
//接收数据
val stream: ReceiverInputDStream[String] = streamingContext.socketTextStream("192.168.91.110",9999)
//数据处理
val key: DStream[(String, Int)] = stream.flatMap(x => x.split(" ")).map((_,1)).reduceByKey(_ + _)
//调用out_put operation实现数据输出
key.print()
//启动程序
streamingContext.start()
//等待程序结束
streamingContext.awaitTermination()
}
}
未保存历史数据
6.sparkStreaming数据源
6.1 基本数据源
6.1.1、文件数据源
package cn.itcast.sparkStreaming
import org.apache.spark.streaming.dstream.DStream
import org.apache.spark.{
SparkConf, SparkContext}
import org.apache.spark.streaming.{
Seconds, StreamingContext}
object FileStream {
//使用updateStateByKey这个算子,需要传入一个updateFunc函数;
//seq:传入数据值 option:历史累加值
//返回值是option
//option some none scala当中比较特殊的类型,为了解决null值的问题
//option 是 some和none的父类
//none: 类似于口袋里面什么也没有,但是有一张纸条,上面写着什么也没有
/**
* 定义一个方法,实现将历史数据全部保存下来
* @param inputSum Seq[Int] 将输入数据都累加
* @param resultSum 保存历史的数据
* @return
*/
def updateFunc(inputSum:Seq[Int], resultSum:Option[Int]) :Option[Int] = {
//getOrElse 表示获取历史数据,如果没有则给0
val finalResult: Int = inputSum.sum + resultSum.getOrElse(0)
Option(finalResult) //返回累加之后的结果
//Some(finalResult)
}
/**
* 监控hdfs的某一个目录,一旦有文件新生成,处理文件内容,实现单词统计
* 并且将历史数据保存下来
*
* @param args
*/
def main(args: Array