美图欣赏:
一.SparkStreaming中UpdataStateByKey批次累加算子
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* UpdataStateByKey会将历史结果拿到当前批次进一步计算
* 注意:UpdataStateByKey没有存储结果的功能,
* 所以UpdataStateByKey只能去checkpoint的目录中去拿历史结果
*/
object UpdataStateByKeyDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("UpdataStateByKeyDemo").setMaster("local[2]")
val ssc: StreamingContext = new StreamingContext(conf, Seconds(2))
ssc.checkpoint("D:\\flie\\spark\\day15\\data-20200411")
//设置日志格式
ssc.sparkContext.setLogLevel("ERROR")
//获取数据
val logs: ReceiverInputDStream[String] = ssc.socketTextStream("bigdata115", 6666)
//开始统计
val tups: DStream[(String, Int)] = logs.flatMap(_.split(" ")).map((_, 1))
/**
* updateFunc: (Iterator[(K, Seq[V], Option[S])]) => Iterator[(K, S)],
* 函数的参数中:
* K是指进行聚合的时候的那个相同的key,现在是指的单词
* Seq[V]是指当前批次相同key对应的value,会将相同key对应的value统计的放到Seq里面:Seq(1,1,1,1,1,.....)
* Option[s]是指历史结果相同key对应的结果数据,可能有值,也可能没有值,所以用Option来封装:如果有值Some(),如果没有值则为None
* partitioner: Partitioner,
* 是指指定的分区器
*
* rememberPartitioner: Boolean,
* 是指是否记录父RDD的分区信息
*/
val res: DStream[(String, Int)] = tups.updateStateByKey(fun, new HashPartitioner(ssc.sparkContext.defaultParallelism), true)
res.print
ssc.start()
ssc.awaitTermination()
}
//(Iterator[(K, Seq[V], Option[S])]) => Iterator[(K, S)],
val fun = (it:Iterator[(String,Seq[Int],Option[Int])]) => {
it.map(tup =>{
(tup._1,tup._2.sum+tup._3.getOrElse(0))
})
}
}
————保持饥饿,保持学习
Jackson_MVP