Kafka用流KTable来流INVALID_TOPIC_EXCEPTION

时间:2018-10-30 02:45:30

标签: apache-kafka apache-kafka-streams

我有一个Kafka Stream服务,即使在本地运行,显然也没有理由开始出现特定错误。

我的流服务执行少量操作:

stream
  .map(doSomething)
  .filter(filterSomething)
  .groupBy(groupMyStuffs)
  .aggregate(Map.empty[String, Object])(aggregation)
  .mapValues((k, v) => parseAggResults(k, v))
  .toStream
  .flatMap((_, v) => v)
  .to(outputTopic)

好吧,进行测试时,我发现我的服务在调用函数mapValues的{​​{1}}之后中断了,该函数会将我的数据写入由Kafka Streams转换KTable创建的新主题到Kafka Stream。

我检查了KStreams创建的主题,这些主题在那里:

toStream

然后我尝试进一步解决该问题。我开始调试Kafka Clients类,以确定为什么出现此错误,并在以下代码行中发现了这一点:

https://github.com/apache/kafka/blob/2.0/clients/src/main/java/org/apache/kafka/clients/NetworkClient.java#L966

我能够发现myconsumergroup-KSTREAM-AGGREGATE-STATE-STORE-0000000005-changelog myconsumergroup-KSTREAM-AGGREGATE-STATE-STORE-0000000005-repartition 具有三个输入,例如response,但我不知道第三个输入是什么:

topicMetadata

为了确保所有内容都在这里,这是我的配置:

(type=TopicMetadata, error=NONE, topic=myconsumergroup-KSTREAM-AGGREGATE-STATE-STORE-0000000005-repartition, isInternal=false, partitionMetadata=[(type=PartitionMetadata, error=NONE, partition=0, leader=xxx.xxx.xxx.xxx:9092 (id: 0 rack: null), replicas=xxx.xxx.xxx.xxx:9092 (id: 0 rack: null), isr=xxx.xxx.xxx.xxx:9092 (id: 0 rack: null), offlineReplicas=)])
(type=TopicMetadata, error=NONE, topic=myconsumergroup-KSTREAM-AGGREGATE-STATE-STORE-0000000005-changelog, isInternal=false, partitionMetadata=[(type=PartitionMetadata, error=NONE, partition=0, leader=xxx.xxx.xxx.xxx:9092 (id: 0 rack: null), replicas=xxx.xxx.xxx.xxx:9092 (id: 0 rack: null), isr=xxx.xxx.xxx.xxx:9092 (id: 0 rack: null), offlineReplicas=)])
(type=TopicMetadata, error=INVALID_TOPIC_EXCEPTION, topic=, isInternal=false, partitionMetadata=[])

我的问题是,我们的部署正在正常工作,突然所有事情开始出现此错误:

logger.info(s"Loading Kafka configurations")
logger.info(s"Kafka Connection with: ${getEnvVar("KAFKA_PROTOBUF_CONN")}")
logger.info(s"Consumer Name: ${getEnvVar("CONSUMER_STREAM_NAME")}")
settings.put(StreamsConfig.APPLICATION_ID_CONFIG, getEnvVar("CONSUMER_STREAM_NAME"))
settings.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, getEnvVar("KAFKA_PROTOBUF_CONN"))
settings.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, getEnvVar("AUTO_OFFSET_RESET_CONFIG"))
settings.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass.getName)
settings.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.ByteArray().getClass.getName)
settings.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 10.seconds)
settings.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, "0")
//Added to avoid messages created by old producers
settings.put(StreamsConfig.DEFAULT_TIMESTAMP_EXTRACTOR_CLASS_CONFIG, "org.apache.kafka.streams.processor.WallclockTimestampExtractor")

settings.put(StreamsConfig.BUFFERED_RECORDS_PER_PARTITION_CONFIG, "1000")
settings.put(StreamsConfig.producerPrefix(ProducerConfig.ACKS_CONFIG), "all")
settings.put(StreamsConfig.producerPrefix(ProducerConfig.MAX_REQUEST_SIZE_CONFIG), 20.mb)

if (!isLocalRun)
  settings.put(StreamsConfig.REPLICATION_FACTOR_CONFIG, "3")

我正在尝试找出问题所在,此配置有问题或类似问题,但没有成功。 即使在本地计算机上也开始失败,可能是什么原因?

1 个答案:

答案 0 :(得分:0)

橡皮鸭再次袭击...

这个问题的答案是,输出主题的配置得到一个空字符串。

因此.to(outputTopic)的生产者在mapValues之后失败了