SparkStreaming 窗口函数

背景:

窗口函数包括2部分,一个是窗口长度,一个是滑动长度。

我们知道,SparkStreaming和Storm完全实时不同,它是每隔一段时间搞一次的,比如是5秒。

因此这里就产生3个概念:间隔、窗口长度、滑动距离

间隔:比如为5s,代表的是无论怎么样,SparkStreaming每5s从源处获取一次数据进行处理,至于展示不展示,这个它不管,因为这是由窗口函数决定的

窗口长度:就是每次展示时,到底显示几个间隔里面的内容。假如窗口长度设置为10s,则显示最近2个间隔里面的数据

滑动距离:就是到底在几个间隔后开始展示。注意滑动距离最好小于等于窗口长度,否则就会显示不全数据。注意:滑动长度也必须是间隔的整数倍,比如是5s.滑动长度的意思是2次计时的间隔。

为了讲清楚,下面画一个图,假设间隔为5s,一个格式代表5s.那么窗口长度为10s,滑动距离为5s的长度如下

代码如下

package scalapackage.testspark

import org.apache.spark.{HashPartitioner, SparkConf}
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
  * Created by Germmy on 2018/6/3.
  */
object WindowsTest {


  def main(args: Array[String]) {
    val sc=new SparkConf().setAppName("SparkStreamingWC").setMaster("local[2]")

    val ssc: StreamingContext = new StreamingContext(sc,Seconds(5))
    ssc.checkpoint("hdfs://node01:9000/ck-20180603")//针对SparkStreaming设置的checkpoint,在读文件后设置ck也可以

    val textStream: ReceiverInputDStream[String] = ssc.socketTextStream("192.168.92.142",8888)

    val dStream: DStream[(String, Int)] = textStream.flatMap(_.split(" ")).map((_,1))

    val key: DStream[(String, Int)] = dStream.reduceByKeyAndWindow((a:Int,b:Int)=>a+b,Seconds(10),Seconds(30))

    key.print(10)

    ssc.start()

    ssc.awaitTermination()
  }


}

猜你喜欢

转载自my.oschina.net/windows20/blog/1823463
今日推荐