SparkStreaming中UpdataStateByKey批次累加算子

美图欣赏:
在这里插入图片描述

一.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

猜你喜欢

转载自blog.csdn.net/Jackson_mvp/article/details/105458403