DStream转换
无状态转化操作
无状态转化操作就是把简单的 RDD 转化操作应用到每个批次上,也就是转化 DStream 中的每一个 RDD。部分无状态转化操作列在了下表中。注意,针对键值对的 DStream 转化操作(比如
reduceByKey())要添加 import StreamingContext._才能在 Scala 中使用。
事实上每个 DStream 在内部是由许多 RDD(批次)组成,且无状态转化操作是分别应用到每个 RDD 上的。
object SparkStreaming06_State_Transform {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[4]").setAppName("StreamWordCount")
val ssc = new StreamingContext(sparkConf, Seconds(3))
val lines = ssc.socketTextStream("hadoop104", 9990)
//Code:Driver端
val newDS = lines.transform(
rdd => {
//Code:Driver端,周期性执行
rdd.map(
str=>{
//Code:Executor端
str
}
)
}
)
//Code:Driver端
val newDS1 = lines.map(
data => {
//Code:Executor端
data
})
ssc.start()
ssc.awaitTermination()
}
}
有状态转化操作
UpdateStateByKey
UpdateStateByKey 原语用于记录历史记录,有时,我们需要在 DStream 中跨批次维护状态(例
如流计算中累加 wordcount)。
object SparkStreaming05_State {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[4]").setAppName("StreamWordCount")
val ssc = new StreamingContext(sparkConf, Seconds(3))
ssc.checkpoint("cp")
val datas = ssc.socketTextStream("hadoop104", 9990)
val mapDatas = datas.map((_, 1))
// mapDatas.reduceByKey(_+_).print()
val result: DStream[(String, Int)] = mapDatas.updateStateByKey(
(seq: Seq[Int], buff: Option[Int]) => {
Option(buff.getOrElse(0) + seq.sum)
}
)
result.print()
ssc.start()
ssc.awaitTermination()
}
}
WindowOperations
Window Operations 可以设置窗口的大小和滑动窗口的间隔来动态的获取当前 Steaming 的允许
状态。所有基于窗口的操作都需要两个参数,分别为窗口时长以及滑动步长。
窗口时长:计算内容的时间范围;
滑动步长:隔多久触发一次计算。
注意:这两者都必须为采集周期大小的整数倍。
object SparkStreaming06_State_Window {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[4]").setAppName("StreamWordCount")
//采集3s为一批数据,默认一批一计算
val ssc = new StreamingContext(sparkConf, Seconds(3))
val lines = ssc.socketTextStream("hadoop104", 9990)
val wordToOne = lines.map((_, 1))
//窗口大小为攒截至当前最新2批一计算
//步长:隔多久触发计算 ,避免出现重复数据,只要>=窗口就没有重复数据,默认的步长为一批
val windowDS = wordToOne.window(Seconds(6),Seconds(6))
windowDS.reduceByKey(_+_).print()
ssc.start()
ssc.awaitTermination()
}
}