1、什么是 Spark Streaming?
Spark Streaming 可以近实时地从 Kafka,Flume,TCP socket 接受数据,并对其进行实时处理。
它的原理是将流式计算转为一批很小的的批处理作业。
2、Streaming 中的常用概念
离散流(DStream):Streaming对内部持续的实时数据流的抽象描述,对Dstream的操作最终都转为了对 RDD 的操作
批数据(batch data):这是化整为零的第一步,将实时流数据以时间片为单位进行分批,将流处理转化为时间片数据的批处理
批处理时间间隔( batch interval):这是人为地对流数据进行定量的标准,以时间片作为我们拆分流数据的依据。一个时间片的数据对应一个RDD实例
窗口长度(window length):一个窗口覆盖的流数据的时间长度。必须是批处理时间间隔的倍数
滑动时间间隔(slide interval ):前一个窗口到后一个窗口所经过的时间长度。必须是批处理时间间隔的倍数,默认同批处理时间间隔
3、 StreamingContext
在 Spark Streaming 当中,StreamingContext是整个程序的入口,其创建方式有多种,最常用的是通过 SparkConf 来创建,创建时,需要传入批处理时间间隔。 DStream 创建需要依赖于它。 StreamingContext 创建成功后,使用输入源(kafka、flume、tcp socket等等)来创建 Dstream。
import org.apache.spark._
import org.apache.spark.streaming._
val conf = new SparkConf().setAppName(appName).setMaster(master)
val ssc = new StreamingContext(conf, Seconds(1))
// 创建 socket 类型 DStream
val lines = ssc.socketTextStream("localhost", 9999) //消费者
4、 Streaming 操作流程
当创建完成StreamingContext之后,再按下列步骤进行:
1)通过输入源创建InputDStreaim
2)对DStreaming进行transformation和output操作,这样操作构成了后期流式计算的逻辑
3)通过StreamingContext.start()方法启动接收和处理数据的流程
4)使用streamingContext.awaitTermination()方法等待程序处理结束(手动停止或出错停止)
5)也可以调用streamingContext.stop()方法结束程序的运行
关于StreamingContext有几个值得注意的地方:
1)StreamingContext启动后,增加新的操作将不起作用。也就是说在StreamingContext启动之前,要定义好所有的计算逻辑
2)StreamingContext停止后,不能重新启动。也就是说要重新计算的话,需要重新运行整个程序。
3)在单个JVM中,一段时间内不能出现两个active状态的StreamingContext
4)调用StreamingContext的stop方法时,SparkContext也将被stop掉,如果希望StreamingContext关闭时,保留SparkContext,则需要在stop方法中传入参数stopSparkContext=false
5、 Streaming WordCount 示例
import org.apache.spark._
import org.apache.spark.streaming._
val sparkConf = new SparkConf().setAppName("StreamingWordCount").setMaster("local[4]")
val ssc = new StreamingContext(sparkConf, Seconds(2))
val words = lines.flatMap(_.split(" "))
val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
wordCounts.print()
ssc.start()
ssc.awaitTermination()
设计到IDEA软件下载scala插件的地址 https://plugins.jetbrains.com/plugin/1347-scala/versions