Spark Streaming与kafka对接

使用KafkaUtil来实现SparkStreaming的对接。 KafkaUtil共有两个版本:

spark-streaming-kafka-0-8spark-streaming-kafka-0-10
kafka version0.8.2.1 or higher0.10.0 or higher
Offset Commit API×

其中0.8版本已经被遗弃, 不建议使用。

消费kafka共有三种消费语义:
1.At most once: 至多消费一次
2.At least once: 至少一次
3.Exactly once:精确消费一次

其中, at least once级别推荐使用官方API对kafka offset进行维护, 代码如下:

object SSApp02 {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[2]").setAppName("hehe")
    val ssc = new StreamingContext(sparkConf, Seconds(3))
    ssc.sparkContext.setLogLevel("ERROR")
    val kafkaParams = Map[String, Object](
      "bootstrap.servers" -> "c1:9092,c2:9092,c3:9092",
      "key.deserializer" -> classOf[StringDeserializer],
      "value.deserializer" -> classOf[StringDeserializer],
      "group.id" -> "use_a_separate_group_id_for_each_stream",
      "auto.offset.reset" -> "earliest",
      "enable.auto.commit" -> (false: java.lang.Boolean)
    )

    val topics = Array("testtopic")
    val stream = KafkaUtils.createDirectStream[String, String](
      ssc,
      PreferConsistent,
      Subscribe[String, String](topics, kafkaParams)
    )

    stream.map(record => ((record.key), (record.value))).print()
    stream.foreachRDD { rdd =>
      val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
      rdd.foreachPartition { iter =>
        val o: OffsetRange = offsetRanges(TaskContext.get.partitionId)
        println(s"partition=${o.partition}, fromOffset=${o.fromOffset}, untilOffset=${o.untilOffset}")

      }
      stream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)
    }

    ssc.start()
    ssc.awaitTermination()
  }
}

Exactly once级别的实现方法见我的另一篇博客:
kafka + spark streaming 确保不丢失不重复消费的offset管理方法

转载于:https://my.oschina.net/dreamness/blog/3093153

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值