spark steaming reduceByKeyAndWindow疑惑请教高手

mextb1860 2019-01-03 01:43:09
流程:kafka中读取数据,用steaming进行流程处理,我现在对kafka中生产一条数据,spark 每隔2秒计算最近10秒内产生的数据,但是现在reduceByKeyAndWindow数据一直都有数据,无法理解,按道理应该一条数据最多保存10秒钟。

代码代码如下,请高手指教。


object AdsClick1 {
def main(args: Array[String]): Unit = {

val kafkaBrokerList = "192.168.1.114:9092,192.168.1.115:9092,192.168.1.116:9092"
val groupId = "SparkStreaming-ads-test"
val topicSet = Set[String]("ads_test")
val blacklist = "blacklist-test"
val kafkaParamMap = Map[String, String](
"group.id" -> groupId,
"metadata.broker.list" -> kafkaBrokerList,
"auto.offset.reset" -> "largest").toMap
val conf = new SparkConf()
.setMaster("local
  • "
  • )
    .setAppName(s"${this.getClass.getSimpleName}")
    .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    .set("spark.task.maxFailures", "16")
    val sc = new SparkContext(conf)
    sc.setLogLevel("WARN")
    val streamingContext = new StreamingContext(sc, Seconds(2))
    streamingContext.checkpoint("checkpoint-ads")
    val directStream: InputDStream[(String, String)] = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](streamingContext, kafkaParamMap, topicSet.toSet)
    directStream.foreachRDD(rdd => {
    val offsetsList = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
    val kc = new KafkaCluster(kafkaParamMap)
    val offsetMap = Map[TopicAndPartition, Long]()
    for (offsets <- offsetsList) {
    val tp = TopicAndPartition(offsets.topic, offsets.partition)
    offsetMap += (tp -> offsets.untilOffset)
    }
    kc.setConsumerOffsets(groupId, offsetMap.toMap)
    })
    val adsPairRDD: DStream[(String, (String, String, String,Integer))] = directStream.map(item => {
    val fields: Array[String] = item._2.split(",")
    (fields(1), (fields(0), fields(2), fields(3),1))
    })
    val reduceWindowRDD: DStream[(String, (String, String, String, Integer))] = adsPairRDD.reduceByKeyAndWindow(
    (a, b) => (a._1, a._2, a._3, a._4 + b._4)
    ,(a, b) => (a._1, a._2, a._3, a._4 - b._4)
    , Seconds(10)
    ,Seconds(2)
    )
    reduceWindowRDD.foreachRDD(rdd=>{
    rdd.collect().foreach(item=>{
    println(item)
    })
    })
    streamingContext.start()
    streamingContext.awaitTermination()
    }
    }




打印结果如下:

(cc,(1528037285,hangzhou,left,1))
(cc,(1528037285,hangzhou,left,1))
(cc,(1528037285,hangzhou,left,1))
(cc,(1528037285,hangzhou,left,1))
(cc,(1528037285,hangzhou,left,1))
(cc,(1528037285,hangzhou,left,0))=》这后面还有数据且后面数字是0,应该没有数据了,无法理解
(cc,(1528037285,hangzhou,left,0))
(cc,(1528037285,hangzhou,left,0))
(cc,(1528037285,hangzhou,left,0))
.......
.......
.......
一直有这条数据
...全文
329 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
小~蜉蝣 2019-12-24
  • 打赏
  • 举报
回复 1
加个过滤函数,过滤掉v是0的数据不就行了
 大富翁  2019-01-22
  • 打赏
  • 举报
回复
厉害了,看得我头晕
mextb1860 2019-01-14
  • 打赏
  • 举报
回复
有高手帮忙回答一下吗?

1,258

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧