Kafka的基于直接流的SparkStreaming仅显示一个Consumer-ID

时间:2019-07-16 13:56:38

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

我正在将kafka-2.3.0与spark 2.2.1以及scala 2.11一起使用。我正在使用直接流方法,在这种方法中,驱动程序查询最新的偏移量,并确定该批处理流的偏移量范围,然后使用这些偏移量范围执行程序从Kafka中读取数据。 如您在下面看到的,我有一个名为 test-kafka 的主题,该主题具有4个分区,它们分布在两个领导者之间。

enter image description here 现在,我开始火花流式传输,它使用以下配置从同一主题读取数据:

                val kafkaParams = Map[String, Object](
                "bootstrap.servers" -> "localnosql1:9092,localnosql2:9092",
                "key.deserializer" -> classOf[StringDeserializer],
                "value.deserializer" -> classOf[StringDeserializer],
                "group.id" -> "streaming-group",
                "auto.offset.reset" -> "earliest",  
                "auto.commit.interval.ms" -> "1000",
                "enable.auto.commit" -> (true: java.lang.Boolean)
            )
            val topics = Array("test-kafka")
            val stream = KafkaUtils.createDirectStream[String, String](
                        ssc,
                        PreferConsistent,
                        Subscribe[String, String](topics, kafkaParams)
            )

所以,现在,当我在CLI上查看有关使用者组的信息时。它显示仅分配了一个使用者ID。这是否意味着只有一个消费者在使用Kafka的数据?如果是,为什么会这样?我有两个执行程序在运行kafka的同一台计算机上运行,​​如下所述。

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

可能是您提交了相对于Driver的偏移量(有效)。驱动程序从Kafka获取偏移量并将其移交给Executor,在执行程序中KafakRDD从Kafka中提取实际数据。处理完批处理后,驱动程序将偏移量提交给Kafka。

我在这里也有同样的问题,是链接:Spark Streaming Direct Kafka Consumers are not evenly distrubuted across executors