从Savepoint恢复时,Flink无法将并行度从n降至1的问题咨询
Flink从Savepoint重启时Window算子并行度降至1报错的解决方案
当Flink程序包含Window算子,从Savepoint重启时如果把并行度从n降到1,会触发以下错误:
IllegalStateException: 无法回滚到检查点/保存点元数据。检查点/保存点状态与新程序之间的最大并行度不匹配。无法将最大并行度为128的算子0e059b9f403cf6f35592ab773c9408d4映射到最大并行度为1的新程序。这表明检查点/保存点生成后,程序已以不兼容的方式修改。
问题原因
Flink里Window算子的状态是按键分组存储的,且和算子的最大并行度绑定。默认情况下Window算子的最大并行度是128,当你把并行度降到1时,新程序中该算子的最大并行度会被自动设为1,和Savepoint里存储的128不匹配,导致状态无法正常映射。
解决办法
显式指定原最大并行度重启
重启时在设置并行度为1的同时,确保Window算子的最大并行度和生成Savepoint时一致(比如默认的128)。可以在代码里给Window算子添加setMaxParallelism(128),或者在提交命令中指定:flink run -s <你的Savepoint路径> -Dparallelism.default=1 -Dtaskmanager.numberOfTaskSlots=1 你的程序jar包路径生成兼容的新Savepoint
先以原并行度n从旧Savepoint重启作业,然后触发一个指定最大并行度为1的新Savepoint,再用新Savepoint以并行度1重启:- 原并行度重启:
flink run -s <旧Savepoint路径> -Dparallelism.default=n 你的程序jar包路径 - 触发新Savepoint:
flink savepoint <作业ID> <新Savepoint路径> -Dmax.parallelism=1 - 停掉当前作业,用新Savepoint以并行度1重启:
flink run -s <新Savepoint路径> -Dparallelism.default=1 你的程序jar包路径
- 原并行度重启:
提前规划最大并行度
开发阶段就给Window算子设置合适的最大并行度(比如256),确保后续调整并行度时在允许范围内,避免重启兼容问题。代码示例:stream.keyBy(...) .window(TumblingEventTimeWindows.of(Time.minutes(5))) .setMaxParallelism(256) .reduce(...);
内容的提问来源于stack exchange,提问作者J Edmond
相关产品推荐
相关产品推荐

