我正在将kafka-2.3.0与spark 2.2.1以及scala 2.11一起使用。我正在使用直接流方法,在这种方法中,驱动程序查询最新的偏移量,并确定该批处理流的偏移量范围,然后使用这些偏移量范围执行程序从Kafka中读取数据。 如您在下面看到的,我有一个名为 test-kafka 的主题,该主题具有4个分区,它们分布在两个领导者之间。
现在,我开始火花流式传输,它使用以下配置从同一主题读取数据:
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的同一台计算机上运行,如下所述。
答案 0 :(得分:1)
可能是您提交了相对于Driver的偏移量(有效)。驱动程序从Kafka获取偏移量并将其移交给Executor,在执行程序中KafakRDD从Kafka中提取实际数据。处理完批处理后,驱动程序将偏移量提交给Kafka。
我在这里也有同样的问题,是链接:Spark Streaming Direct Kafka Consumers are not evenly distrubuted across executors