Kafka中的默认消费者组ID

时间:2019-01-17 10:05:32

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

我正在使用Kafka 2.11,并且还很新。我试图了解kafka消费者组,我有3个Spark应用程序正在使用同一主题,并且每个应用程序都从该主题接收所有消息。由于我没有在应用程序中提及任何使用者组ID,因此我假设Kafka为其分配了一些不同的使用者组ID。 我需要使用以下命令为应用程序之一重置kafka偏移量。由于我不知道我的应用程序的使用者组名称,因此有点卡在这里。我是否需要在应用程序中明确分配组ID,然后在下面的命令中使用它?

./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --reset-offsets --to-datetime 2017-11-1907:52:43:00:000 --group <group_name> --topic <topic_name> --execute

如果是这样,如何获得每个应用程序的使用者组ID?我不能

3 个答案:

答案 0 :(得分:2)

消费者group.id是必需的。如果未设置使用者group.id,则将获得异常。因此,很显然,您是在代码中的某个位置进行设置,或者所使用的框架或库是在内部进行设置。您应该始终自行设置group.id

您可以使用以下命令获取使用者组ID:

bin/kafka-consumer-groups.sh  --list --bootstrap-server <kafka-broker-ip>:9092

答案 1 :(得分:2)

如果转到Spark代码,则可以找到负责Kafka源阅读器的KafkaSourceProvider类,您会看到生成了随机的group.id:

private[kafka010] class KafkaSourceProvider extends DataSourceRegister

  override def createSource(
    sqlContext: SQLContext,
    metadataPath: String,
    schema: Option[StructType],
    providerName: String,
    parameters: Map[String, String]): Source = {
      validateStreamOptions(parameters)
      // Each running query should use its own group id. Otherwise, the query may be only assigned
      // partial data since Kafka will assign partitions to multiple consumers having the same group
      // id. Hence, we should generate a unique id for each query.
      val uniqueGroupId = s"spark-kafka-source-${UUID.randomUUID}-${metadataPath.hashCode}"
    ...
  }

您可以搜索带有spark-kafka-source前缀的group.id,但是找不到特定组的group.id。

要查找所有使用者组ID,可以使用以下命令: ./kafka-consumer-groups.sh --bootstrap-server KAFKKA_ADDRESS --list

要检查使用者组的偏移量,可以使用以下命令: ./kafka-consumer-groups.sh --bootstrap-server KAFKKA_ADDRESS --group=GROUP_ID --describe

答案 2 :(得分:1)

  

由于我没有在应用程序中提及任何使用者组ID,所以我假设Kafka为其分配了一些不同的使用者组ID

Kafka经纪人不会将消费者组名称分配给与其连接的消费者。 当消费者连接并订阅主题时,它“加入”了一个组。 如果您在未指定任何使用者组的情况下使用Spark应用程序,则意味着以某种方式,您用于从Spark应用程序连接到Kafka的库/框架本身就是在分配使用者组名称。