如何处理Scala中的Kafka错误

时间:2016-11-14 17:23:13

标签: scala apache-spark apache-kafka spark-streaming

我正在通过以下方式阅读Scala中Kafka主题的消息:

import org.apache.spark.streaming.kafka.KafkaUtils

val topicMessagesMap = topicMessages.split(",").map((_, kafkaNumThreads)).toMap

val messages = KafkaUtils.createStream(ssc, zkQuorum, group, topicMessagesMap).map(_._2)

我想知道处理可能的连接失败的正确方法是什么,特别是考虑到我的Spark Streaming作业将在很长一段时间内运行,并且在此期间肯定会出现一些连接问题。 我希望Streaming作业在连接问题时不会停止,但是它应该尝试自动重新连接并读取在连接失败之前它没有处理的所有消息

我认为我应该正确设置auto.offset.resetauto.commit.interval.ms等,但我们非常感谢您提供有关正确设置的详细指导。

1 个答案:

答案 0 :(得分:1)

当您使用Spark为Kafka提供的抽象时,会为您处理错误,您无需担心它们,除非您的Kafka群集出现故障并且您无法再处理消息,在这种情况下将生成流应用程序最终终止。

例如,实际处理Kafka消息的you can read the part of the code(这仅与基于接收者的方法相关):

/** Class to handle received Kafka message. */
private final class MessageHandler(stream: KafkaStream[K, V]) extends Runnable {
    override def run(): Unit = {
      while (!isStopped) {
        try {
          val streamIterator = stream.iterator()
          while (streamIterator.hasNext) {
            storeMessageAndMetadata(streamIterator.next)
          }
        } catch {
          case e: Exception =>
            reportError("Error handling message", e)
        }
      }
    }
}