FAQ-Can not retract a non-existent record.

问题描述/异常栈

java.lang.RuntimeException: Can not retract a non-existent record. This should never happen.
    at org.apache.flink.table.runtime.operators.rank.RetractableTopNFunction.processElement(RetractableTopNFunction.java:196)
    at org.apache.flink.table.runtime.operators.rank.RetractableTopNFunction.processElement(RetractableTopNFunction.java:55)
    at org.apache.flink.streaming.api.operators.KeyedProcessOperator.processElement(KeyedProcessOperator.java:83)
    at org.apache.flink.streaming.runtime.tasks.OneInputStreamTask$StreamTaskNetworkOutput.emitRecord(OneInputStreamTask.java:205)
    at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.processElement(AbstractStreamTaskNetworkInput.java:135)
    at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.emitNext(AbstractStreamTaskNetworkInput.java:106)
    at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:66)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:424)
    at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:204)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:685)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.executeInvoke(StreamTask.java:640)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.runWithCleanUpOnFail(StreamTask.java:651)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:624)
    at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:799)
    at org.apache.flink.runtime.taskmanager.Task.run(Task.java:586)
    at java.lang.Thread.run(Thread.java:877)

发现版本

LTS 650

解决方案

1.使用源表中定义的只会产生确定性值的字段作为排序字段(ORDER BY)和分组字段(PARTITION BY)。
2.调大table.exec.state.ttl参数值。

问题原因

1.由代码中now()导致。
因为TopN不支持非确定性的字段作为排序字段(ORDER BY)或分组字段(PARTITION BY),now()每次输出的值不同,所以导致Retraction无法找到之前的值。
2.table.exec.state.ttl参数值设置过小,State因过期被清理,retract时找不到对应keystate

作者:denglaixiang