Flink 停止 job 的方式(stop 和 cancel)

2,211 阅读3分钟

Flink 是一个开源的流处理框架,用于构建实时数据流处理和分析应用。在 Flink 中,应用程序被称为作业(Job),而开发人员和系统管理员需要知道如何控制这些作业的执行。本文将解释两种停止 Flink 作业的方式:stop 和 cancel,并提供一些建议和注意事项。

Stop

在 Flink 中,停止作业(stop)是通过调用 StreamExecutionEnvironment.stop() 方法实现的。停止作业允许当前正在执行的流处理逻辑进行有序的关闭,而不是立即终止。Flink 会在 checkpoint 之后停止作业,因此停止操作是有状态的,可以保证数据不丢失。

停止作业的过程如下:

1.1. 用户调用 StreamExecutionEnvironment.stop() 方法通知 Flink 作业需要停止;
1.2. Flink 框架等待下一个 checkpoint 完成;
1.3. Flink 在 checkpoint 完成后停止任务的所有部分;
1.4. 作业最终以完成状态("Finished")结束。

由于停止作业会确保作业状态和数据一致性,因此在需要数据安全和可恢复的场景下,停止作业是首选方法。

Cancel

取消作业(cancel)是另一种终止 Flink 作业的方式。相对于停止作业,取消作业是一种立即终止程序执行的方法。这种操作无法确保数据处理的原子性和一致性,可能会导致部分数据丢失。

取消作业的过程如下:

2.1 用户调用 ClusterClient.cancel() 方法或在 Flink Web UI 中点击 "Cancel" 按钮;

image.png

2.2 Flink 立即停止任务的所有部分;
2.3 作业最终以已取消状态("Canceled")结束。

在以下情况下,可能需要使用取消作业操作: 作业运行出错或产生无法抢救的错误时; 对数据不敏感或数据无法保证一致性; 资源有限,立即需要终止作业释放资源。

建议和注意事项

在实际生产环境中,请根据具体情况选择停止还是取消作业。以下是一些建议和注意事项:

3.1. 如果对数据处理结果的一致性有要求,且希望保证处理过程中无数据丢失,请优先选择停止(stop)作业。这样可以确保作业在有序关闭之前,会进行 checkpoint 存储状态信息。
3.2. 在使用停止作业时,请注意检查 Flink 版本是否支持恢复 checkpint 数据。某些较低版本的 Flink 可能无法保证停止后的数据恢复。
3.3. 如果作业出现无法恢复的故障,例如出现死循环或无法控制的异常,可以选择取消作业。请注意,此时可能会丢失部分数据,且作业状态会显示为已取消。
3.4. 如果对作业停止灵活性有更高要求,可以考虑将作业分区或设置多个独立任务,这将有助于对作业进行更细粒度的控制。

总之,Flink 支持两种停止作业的方式:stop 和 cancel。每种方式均有适用的场景,用户可以根据需求以及数据处理的敏感性,合理选择并合理使用。