一、概念
Spark Streaming提供了一个高级抽象的流,即DStream(离散流) 。DStream表示连续的数据流,内部结构是一系列的rdd组成,每个rdd都是一下段由时间分割开的数据集,最终都会转变成对底层RDD的操作。
Spark Streaming将实时的数据分解成一系列很小的批处理任务。批处理任务引擎Spark Core把输入的数据按照一定的时间片分成一段一段的数据,每一段数据都会转换成成rdd输入到spark core中,然后将dstream操作转成rdd算子的相关操作,即转换操作,窗口操作及输出操作,处理的结果可以以批处理的方式传给外部系统。
二、DStream转换操作
Spark Streaming中对DStream的转换操作会转变成对RDD的准换操作
2.1 transform
通过对源DStream中的每个RDD应用RDD-to-RDD函数返回一个新DStream,这样就可以在DStream中做任意的RDD操作
2.11 执行 nc -lk 9999启动服务端且监听socket 服务
2.12 在pom引入
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_2.11</artifactId> <version>2.4.3</version> </dependency>
2.13 新建WindowTest 类
object WindowTest {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("WindowTest").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
sc.setLogLevel("WARN")
val ssc = new StreamingContext(sc, Seconds(5));
val dstream = ssc.socketTextStream("192.168.221.131", 9999)
val words = dstream.transform(rdd => rdd.flatMap(_.split(" ")))
words.print()
ssc.start()
ssc.awaitTermination()
}
验证:输入:l am learning Spark Streeam now
结果:
备注:
- new SparkConf().setAppName("WindowTest").setMaster("local[2]")中local[2]表示SparkStreaming必须至少设置两个线程
- new StreamingContext(conf, Seconds(5)) 中Seconds(5)是批处理时间间隔
- ssc.start() 开启流计算
- ssc.awaitTermination() 用于保持程序一直运行,除非人工干预停止