简介:
- Spark Streaming是微批次处理方式,批处理间隔是Spark Streaming是的核心概念和关键参数。
- Spark Streaming需要单独一个节点来接收数据,所以Spark
有状态算子:
- window
// windowLength : 窗口长度 – 窗口的持久时间(执行一次持续多少个时间单位)
// slideInterval : 滑动步长 – 窗口操作被执行的间隔(每多少个时间单位执行一次)
window(windowLength, slideInterval)
- reduceByKeyAndWindow(reduceFunc: (V, V) => V, windowDuration: Duration, slideDuration: Duration)
val wordAndOne: DStream[(String, Int)] = words.map((_, 1))
/*
参数1: reduce 计算规则
参数2: 窗口长度
参数3: 窗口滑动步长. 每隔这么长时间计算一次.
*/
val count: DStream[(String, Int)] =
wordAndOne.reduceByKeyAndWindow((x: Int, y: Int) => x + y,Seconds(15), Seconds(10))
- reduceByKeyAndWindow(reduceFunc: (V, V) => V, invReduceFunc: (V, V) => V, windowDuration: Duration, slideDuration: Duration)
实际当中也不会使用此方法,因为要使用历史数据就需要用到checkpoint,而checkpoint就会产生大量小文件
// 比没有invReduceFunc高效. 会利用旧值来进行计算.
// invReduceFunc: (V, V) => V 窗口移动了, 上一个窗口和新的窗口会有重叠部分,
// 重叠部分的值可以不 用重复计算了. 第一个参数就是新的值, 第二个参数是旧的值.
val count: DStream[(String, Int)] =
wordAndOne.reduceByKeyAndWindow((x: Int, y: Int) => x + y,(x: Int, y: Int) => x - y,Seconds(15), Seconds(10))
- countByWindow(windowLength, slideInterval)
返回一个滑动窗口计数流中的元素的个数。
- countByValueAndWindow(windowLength, slideInterval, [numTasks])
对(K,V)对的DStream调用,返回(K,Long)对的新DStream,其中每个key的的对象的v是其在滑动窗口中频率。如上,可配置reduce任务数量。