读取kafka数据的偏移量的维护

使用spark来获取kafka的数据

要建立一个连接对象来获取数据——对象的建立需要传入偏移量参数

偏移量的初始值:多个分区需要有多行数据。
partition从0开始排,逐个增加。
在这里插入图片描述

 //kafka的连接参数
    val kafkaParams = Map[String, Object](
      "bootstrap.servers" -> "hadoop101:9092,hadoop1012:9092,hadoop10103:9092",
      "key.deserializer" -> classOf[StringDeserializer],
      "value.deserializer" -> classOf[StringDeserializer],
      "group.id" -> "group1",
      "auto.offset.reset" -> "latest",
      "enable.auto.commit" -> (false: java.lang.Boolean)
    )
    //设置读取偏移量
    DBs.setup()
    var toMap: Map[TopicPartition, Long] = DB.readOnly { implicit session =>
      SQL("select * from train0701offset where topic=? and groupid=?")
        .bind("first", "group1")
        .map(line => (
          new TopicPartition(line.string("topic"), line.int("partition")),
          line.long("offset")
        )).list().apply()
    }.toMap



var directStream: InputDStream[ConsumerRecord[String, String]] = KafkaUtils.createDirectStream(
      scc,
      //位置
      LocationStrategies.PreferConsistent,
      //消费策略
      ConsumerStrategies.Subscribe[String, String](
        //指定主题
        Array("first", "second"),
        //kafka配置
        kafkaParams,
        //偏移量
        toMap
      )
    )

获取的directStream为rdd的集合

获取偏移量存入数据库

 //处理返回的数据
  directStream.foreachRDD(rdd=>{
    if(!rdd.isEmpty()){
      //kafka的数据中有偏移量的值
      var ranges: Array[OffsetRange] = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
      //写入数据库
      DBs.setup()
      DB.localTx{implicit session=>
        ranges.foreach(ors=>{
          SQL("update train0701offset set offset=? where topic=? and groupid=? and partition=?")
            .bind(ors.untilOffset,ors.topic,"group1",ors.partition)
            .update().apply()
        })
      }
    }
  })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值