sparkstreaming对接kafka保存offset到redis

记录一下自己写的sparkstreaming保存offset到redis,并从上次的offset消费

	//初始化streamingcontext对象
    val ssc: StreamingContext = new StreamingContext(sc, Seconds(2))

    //初始化jedis
    val jedis: JedisCluster = JedisConnectionUtil.getJedisCluster
    var kafkadata: InputDStream[(String, String)] = null

    //修改key
    val jsonOffset = jedis.get("huhuhu")

    //判断是否保存有offset
    if(jsonOffset == null){
      kafkadata = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, sourceTopic)
    }else{
      //封装offset
      val array = JSON.parseArray(jsonOffset).toArray
      var topicmap = Map[TopicAndPartition, Long]()
      for (elem <- array) {
        val array = elem.asInstanceOf[JSONArray].toArray()
        topicmap += (TopicAndPartition(array(0).toString,array(1).toString.toInt)  -> array(3).toString.toLong)
      }
      val messageHandler = (mm:MessageAndMetadata[String,String]) => (mm.key(),mm.message())
      //创建kafkardd
      //结束时间   17:25
      kafkadata = KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder,(String,String)](ssc, kafkaParams, topicmap,messageHandler)
    }
    //linesData = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, sourceTopic)




    //读取kafka数据
    var offsetRanges = Array.empty[OffsetRange]
    kafkadata.transform(rdd => {
      offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
      rdd
    }).foreachRDD(rdd => {

      var arr = ArrayBuffer[Any]()
      for (o <- offsetRanges) {
        arr += Array(o.topic, o.partition,o.fromOffset, o.untilOffset)
      }
      var json = JSON.toJSONString(arr.toArray, true)
      //修改redis的key
      jedis.set("huhuhu",json)
    })
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值