【问题标题】:Kafka uncommitted message not getting consumed againKafka未提交的消息不再被消费
【发布时间】:2019-08-18 09:29:14
【问题描述】:

我正在处理 kafka 消息并使用带有手动偏移提交的 spark 流插入 kudu 表,这是我的代码。

val topicsSet = topics.split(",").toSet
val kafkaParams = Map[String, Object](
  ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> brokers,
  ConsumerConfig.GROUP_ID_CONFIG -> groupId,
  ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer],
  ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer],
  ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG -> (false: java.lang.Boolean),
  ConsumerConfig.AUTO_OFFSET_RESET_CONFIG -> "earliest" //"latest" //"earliest"
 )
val stream = KafkaUtils.createDirectStream[String, String](
                        ssc,
                        PreferConsistent,
                        Subscribe[String, String](topicsSet, kafkaParams)
                       )
stream.foreachRDD { rdd =>
var offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
//offsetRanges.foreach(println)
var msgOffsetsRdd = rdd.map(msg =>{
val msgOffset = OffsetRange(msg.topic(), msg.partition(),  msg.offset(), msg.offset()+1)
        println(msg)
        msgOffset 
      }
    )
   val msgOffsets = msgOffsetsRdd.collect() //here idea was to get only processed messages offsets for commit
   stream.asInstanceOf[CanCommitOffsets].commitAsync(msgOffsets)
}

让我们列出这个示例在将数据插入 kudu 时出现错误,我需要再次处理这些消息,如果我停止工作并重新启动它,我能够得到未提交的消息,我们不能得到所有未提交的消息吗流媒体?

【问题讨论】:

    标签: apache-kafka spark-streaming kafka-consumer-api


    【解决方案1】:

    你有消息,为什么不放一个重试逻辑以防失败。 当您重新连接时,Kafka 会给您相同的消息,以防您的消费者崩溃,不确定 Kafka 是否会在连接仍然打开时给出相同的消息。

    如果失败是由于目标数据存储不可用,您可以在代码中包含一些重试逻辑,或者如果插入失败的消息格式不正确,您可以将这些消息保存到临时缓存、数据存储或其他 kafka 主题中以重试稍后或检查这些消息有什么问题。

    【讨论】:

    • 我认为这个解决方案,但问题出在我的流媒体中,我每秒收到约 20 条消息,让我们的 kudu 在我的驱动程序中下降了 2 小时 ~ 144000 条消息将在我的驱动程序内存中它可能让我的流媒体工作崩溃第二个解决方案似乎是一种解决方法,如果我可以从火花流中获取 kafka 消费者对象,我可以在一段时间后寻求
    • 你是在单线程还是多线程中消费消息?如果它是单线程,那么您可以等待 kudu 启动,然后再提取更多消息。如果它是多线程,那么您应该对为消费消息创建的线程数设置上限,并在 kudu 出现故障时阻止这些线程。总而言之,当 kudu 宕机时,您需要停止阅读消息
    • 我喜欢这个解决方案你能有一个示例来设置上限并停止阅读消息吗?这可以解决我的问题非常感谢法老任何指针也对我有帮助
    • 您可以阅读有关 ThreadPools 的信息,您可以使用线程池来维护会消耗消息的线程
    • 如果这回答了您的问题,请将其标记为答案,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2018-06-14
    • 2022-06-15
    • 2020-08-11
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多