Kafka KTable-通过聚合提供TimeoutException的KTable连接:到期1条记录

时间:2019-01-21 11:21:49

标签: spring spring-boot apache-kafka apache-kafka-streams

这是由两个输入主题(inputTopic1和inputTopic2)和一个输出主题(outputTopic)表示的整个拓扑。 首先,我们从第一个主题创建一个表-网络表及其Serdes。 其次,由于inputTopic2的键记录与inputTopic1的键不同,因此我们首先将流映射到新键值(companyId的长值),然后对所有值进行分组并汇总到整个公司的列表中,以便返回的表中,键是companyId,值是该公司所有卡的列表。

所有这些转换之后,我们将历史记录表与网络表连接起来,并将连接结果输出到新主题。

问题是,当我尝试将5万张历史数据卡放入inputTopic2中时,花费大量时间将它们汇总到列表中,并且生产者抛出以下错误:

org.apache.kafka.common.errors.TimeoutException:服务-KSTREAM-AGGREGATE-STATE-STORE-0000000005-changelog-1的1条记录已过期:自上一次尝试加上退避时间以来,已经过去了30043毫秒

整个拓扑代码:

KTable<Long, DefaultDirectedGraph<Card, DefaultEdge>> networkTable = builder.table(inputTopic1,
        Consumed.with(Serdes.Long(), new CompanyNetworkSeder()));
KTable<Long, List<Card>> historyListTable = builder
    .stream(inputTopic2, Consumed.with(new HistoryDataKeySeder(), new HistoryDataValueSeder()))
    .map(new KeyValueMapper<HistoryDataKey, Card, KeyValue<Long, Card>>() {
        public KeyValue<Long, Card> apply(HistoryDataKey key, Card value) {
        return new KeyValue<>(key.getCompanyId(), value);
        }
    }).groupByKey(Serialized.with(Serdes.Long(), new HistoryDataValueSeder())).aggregate(() -> {
        return new ArrayList<Card>();
    }, new Aggregator<Long, Card, List<Card>>() {
        @Override
        public List<Card> apply(Long key, Card newCard, List<Card> currentHistory) {
        if (!historyUtils.checkForDuplicateHistoryCard(newCard, currentHistory)
            && !historyUtils.checkIfCardHasNoEndDate(newCard)) {
            currentHistory.add(newCard);
        }
        return currentHistory;
        }
    }, Materialized.with(Serdes.Long(), new HistoryDataListValueSeder()));

KTable<Long, ForecastInput> joinedTable = historyListTable.leftJoin(networkTable, (history, network) -> {
    if (network == null) {
    return new ForecastInput();
    } else if (history == null) {
    return new ForecastInput(network, null);
    } else {
    return new ForecastInput(network, history);
    }
});

KTable<Long, DefaultDirectedGraph<Card, DefaultEdge>> outputTable = joinedTable
    .mapValues(new ValueMapperWithKey<Long, ForecastInput, DefaultDirectedGraph<Card, DefaultEdge>>() {

        public DefaultDirectedGraph<Card, DefaultEdge> apply(Long companyId,
            ForecastInput forecastInputData) {

        DefaultDirectedGraph<Card, DefaultEdge> network = forecastInputData.getNetwork();

        List<Card> history = forecastInputData.getHistory();


        if (network == null) {
            return new DefaultDirectedGraph<Card, DefaultEdge>(DefaultEdge.class);
        } else if (history == null) {
            return forecastInputData.getNetwork();
        } else {
            return (espService.updateForecastCalculationsForWholeCompany(forecastInputData.getNetwork(),
                forecastInputData.getHistory()));
        }
        }
    });

我认为问题在于聚合会减慢整个流的处理速度。我正在使用kafka 2.0.1版本。

0 个答案:

没有答案