開發(fā)運(yùn)行中的其他問題
本文介紹開發(fā)運(yùn)行中的其他問題。
報(bào)錯:Caused by: java.lang.NoSuchMethodError: org.apache.flink.table.planner.plan.metadata.FlinkRelMetadataQuery.getUpsertKeysInKeyGroupRange(Lorg/apache/calcite/rel/RelNode;[I)Ljava/util/Set;
報(bào)錯原因
如果您依賴了社區(qū)的internal API,而這個internal API阿里云上的版本做了一些優(yōu)化,可能會導(dǎo)致包沖突等異常。
解決方案
Flink源代碼中只有明確標(biāo)注了@Public或者@PublicEvolving的才是公開供用戶調(diào)用的方法,阿里云只對這些方法的兼容性做出產(chǎn)品保證。
報(bào)錯:Task did not exit gracefully within 180 + seconds.
報(bào)錯詳情
Task did not exit gracefully within 180 + seconds. 2022-04-22T17:32:25.852861506+08:00 stdout F org.apache.flink.util.FlinkRuntimeException: Task did not exit gracefully within 180 + seconds. 2022-04-22T17:32:25.852865065+08:00 stdout F at org.apache.flink.runtime.taskmanager.Task$TaskCancelerWatchDog.run(Task.java:1709) [flink-dist_2.11-1.12-vvr-3.0.4-SNAPSHOT.jar:1.12-vvr-3.0.4-SNAPSHOT] 2022-04-22T17:32:25.852867996+08:00 stdout F at java.lang.Thread.run(Thread.java:834) [?:1.8.0_102] log_level:ERROR
報(bào)錯原因
該報(bào)錯不是作業(yè)異常的根因。因?yàn)門ask退出的超時task.cancellation.timeout參數(shù)的默認(rèn)值為180s,當(dāng)作業(yè)Failover或退出過程中,可能會因某種原因阻塞Task的退出。當(dāng)阻塞時間達(dá)到超時時間后,F(xiàn)link會判定該Task已卡死無法恢復(fù),會主動停止該Task所在的TaskManager,讓Failover或退出流程繼續(xù)下去,所以在日志中會出現(xiàn)這樣的報(bào)錯。
真正的原因可能是您自定義函數(shù)的實(shí)現(xiàn)有問題,例如close方法的實(shí)現(xiàn)中長時間阻塞或者計(jì)算方法長時間未返回等。
解決方案
設(shè)置Task退出的超時時間參數(shù)task.cancellation.timeout取值為0,配置方法請參見如何配置作業(yè)運(yùn)行參數(shù)?配置為0時,Task退出阻塞將不會超時,該task會持續(xù)等待退出完成。重啟作業(yè)后再次發(fā)現(xiàn)作業(yè)在Failover或退出過程中長時間阻塞時,需要找到處于Cancelling狀態(tài)的Task,查看該Task的棧,排查問題的根因,然后根據(jù)排查到的根因再針對性解決問題。
重要task.cancellation.timeout參數(shù)用于作業(yè)調(diào)試,請不要在生產(chǎn)作業(yè)上配置該參數(shù)值為0。
報(bào)錯: Can not retract a non-existent record. This should never happen.
報(bào)錯詳情
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)
報(bào)錯原因及解決方案
場景
原因
解決方案
場景1
由代碼中
now()
導(dǎo)致。因?yàn)門opN不支持非確定性的字段作為排序字段(ORDER BY)或分組字段(PARTITION BY),
now()
每次輸出的值不同,所以導(dǎo)致Retraction無法找到之前的值。使用源表中定義的只會產(chǎn)生確定性值的字段作為排序字段(ORDER BY)和分組字段(PARTITION BY)。
場景2
table.exec.state.ttl參數(shù)值設(shè)置過小,State因過期被清理,retract時找不到對應(yīng)keystate。
調(diào)大table.exec.state.ttl參數(shù)值。配置方法請參見如何配置作業(yè)運(yùn)行參數(shù)?
場景3
VVR 4.0.15以下版本的已知缺陷。
上游使用CDC Connector,Hologres全增量一體源表并不是一致性的讀取,全量數(shù)據(jù)和增量數(shù)據(jù)之前是有overlap的,導(dǎo)致在處理binlog一開始的update_before時,會發(fā)現(xiàn)該數(shù)據(jù)在State中不存在。
如果您使用的是CDC或Hologres,建議您升級作業(yè)版本至VVR 4.0.16或VVR 6.0.3及以上版本。