一、window简介
Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD,会作为window DStream的一个RDD。(每个滑动窗口操作,都应该指定两个参数,窗口长度以及滑动间隔)
二、案例
package com.sparkstreaming
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}
object _05WindowOperationDemo {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("WindowOperation")
.setMaster("local[*]")
val ssc = new StreamingContext(conf, Seconds(10))
//需要提前在Linux上使用nc -lp 10086开启服务器
val dStream: ReceiverInputDStream[String] = ssc.socketTextStream("192.168.101", 10086)
val mapDStream: DStream[(String, Int)] = dStream.flatMap(_.split(" ")).map((_, 1))
/**
* window(
* windowDuration:Duration, //第一个参数:用于指定窗口的大小,即长度,必须是micro-batch处理时的时间整数倍
* slideDuration:Duration //第二个参数:用于指定窗口滑动的周期,必须是micro-batch处理时的时间整数倍
* )
*
* 数据的情况:
* 1. 刚启动时,窗口里一定没有数据,如果上游没有数据的时间超过窗口的长度时,窗口也没有数据
* 2. 启动程序不久,窗口的数据的变化应该是由少变多
* 3. 在处理数据过程中,窗口的数据可能会由多变少,甚至没有
*/
val windowDStream: DStream[(String, Int)] = mapDStream.window(Seconds(30), Seconds(10))
val resultDStream: DStream[(String, Int)] = windowDStream.reduceByKey(_ + _)
resultDStream.print()
ssc.start()
ssc.awaitTermination()
}
}