(Scala语言)sparkstreaming手动提交offset值到kafka(0.10版本)简单示例

SparkStreaming对接kafka处理数据流,手动提交offset到kafka
新手小白没事上来写点博客玩玩,第一次昂好紧张。。。大佬们不喜勿喷。
我用的是kafka0.10版本的,不是0.8的,旧版本的kafka的offset值是由zookeeper监管,在对应的brokers/topics/partitions下好像,具体记不清了。0.10版本的kafka则是由kafka自己管理offset,将其放到__consumer_offset的topic下。
sparkstreaming作为Spark重要的组件之一,可以与kafka对接偏实时处理数据,简单来说就是通过自己设置一个时间,程序会将每个时间段内从kafka接受来的数据“一批一批”的进行处理。
说到kafka,大家肯定也不陌生,就不多说了,sparkstreaming处理数据有个参数默认是自动提交,enable.auto.commit:默认为true,kafka自动提交还有个与之对应的参数是auto.commit.interval.ms,默认好像是5000ms也就是5秒?也就是说每隔5秒kafka会自动把当前数据处理的offset更新到kafka中。
小白行事风格:代码直接上就完事了。

package com.yzd

import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.dstream.InputDStream
import org.apache.spark.streaming.kafka010._
import org.apache.spark.{SparkConf, TaskContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}

object kafka_offset {
  def main(args: Array[String]): Unit = {
  //基本参数就不做什么解释了。。。。
      val conf = new SparkConf().setAppName("kafka_test").setMaster("local[4]")
      val streamingContext = new StreamingContext(conf,Seconds(5))
      val kafkaParams = Map[String,Object](
        "bootstrap.servers" -> "10.204.118.101:9092,10.204.118.102:9092,10.204.118.103:9092",
        "key.deserializer" -> classOf[StringDeserializer],
        "value.deserializer" -> classOf[StringDeserializer],
        "group.id" -> "test-consumer",
        "auto.offset.reset" -> "latest",//也可以设置earliest和none,
        //将提交设置成手动提交false,默认true,自动提交到kafka,
        "enable.auto.commit" -> "false"
      )
      
    val topics = Array("test")
    val Dstream: InputDStream[ConsumerRecord[String, String]] = KafkaUtils.createDirectStream(
      streamingContext,
      LocationStrategies.PreferConsistent,
      ConsumerStrategies.Subscribe(topics,kafkaParams)
    )

    Dstream.foreachRDD(rdd =>{
      //此处获取rdd个分区offset值
      val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
      rdd.foreachPartition(partitions =>{
      //此处将遍历分区,得到每个分区的fromOffset和untilOffset
        val o = offsetRanges(TaskContext.get().partitionId())
        //打印到控制台可以明了的查看offset值
        println(o.fromOffset+"- - - - - - - - - - "+o.untilOffset)
        partitions.foreach(line =>{
        //将分区中数据的key,value值打印到控制台
          println("key"+line.key()+"...........value"+line.value())
        })
      })
      //手动提交处理后的offset值到kafka
      Dstream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)
    })
    streamingContext.start()
    streamingContext.awaitTermination()
  }
}

控制台打印topic各个分区的offset值
当然啦,因为我没有重新生产数据所以数据流里面并没有数据,控制台上面只会有分区的offset值昂,算了,生产几条数据看看效果吧。。。。
(Scala语言)sparkstreaming手动提交offset值到kafka(0.10版本)简单示例_第1张图片
(Scala语言)sparkstreaming手动提交offset值到kafka(0.10版本)简单示例_第2张图片
哦了。说是简单实例就指定没有一点难度的。。。最后想跟大家说下如果有想互相学习互相探讨的不嫌弃的大佬可以评论留个QQ或者微信,我是大白,非常的白!!!
(●ˇ∀ˇ●)!!

你可能感兴趣的:(sparkstreaming)