
# Flink作业重启后，如何保证不丢失数据？
DLI Flink提供了完整可靠的Checkpoint/Savepoint机制，您可以利用该机制，保证在手动重启或者作业异常重启场景下，不丢失数据。
- 为了避免系统故障导致作业异常自动重启后，丢失数据：
  - 对于Flink SQL作业，您可以勾选"开启Checkpoint"，并合理配置Checkpoint间隔（权衡执行Checkpoint对业务性能的影响以及异常恢复的时长），同时勾选"异常自动重启"，并勾选"从Checkpoint恢复"。配置后，作业异常重启，会从最新成功的Checkpoint文件恢复内部状态和消费位点，保证数据不丢失及聚合算子等内部状态的精确一致语义。同时，为了保证数据不重复，建议使用带主键数据库或者文件系统作为目标数据源，否则下游处理业务需要加上去重逻辑（最新成功Checkpoint记录位点到异常时间段内的数据会重复消费）。
    图1Flink作业配置参数   
    ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001150725537.png) 
  
  - 对于Flink Jar作业，您需要在代码中开启Checkpoint，同时如果有自定义的状态需要保存，您还需要实现ListCheckpointed接口，并为每个算子设置唯一ID。然后在作业配置中，勾选"从Checkpoint恢复"，并准确配置Checkpoint路径。
    图2开启Checkpoint   
    ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001150807023.png "点击放大")
    ![](https://support.huaweicloud.com/dli_faq/public_sys-resources/note_3.0-zh-cn.png)
    Flink Checkpoint机制可以保证Flink平台可感知内部状态的精确一致，但对于自定义Source/Sink或者有状态算子，需要合理实现ListCheckpointed接口，来保证业务数据需要的可靠性。
    
   
- 为了避免因业务修改等需要，手动重启作业后，不丢失数据：
  - 对于无内部状态的作业，您可以配置kafka数据源的启动时间或者消费位点到作业停止之前。
  
  - 对于有内部状态的作业，您可以在停止作业时，勾选"触发保存点"。成功后，再次启动作业时，开启"恢复保存点"，作业将从选择的savepoint文件中恢复消费位点及状态。同时，由于Flink Checkpoint和Savepoint生成机制及格式一致，因而，也可以通过Flink作业列表"操作"列中的"更多"\>"导入保存点"，导入OBS中最新成功的Checkpoint，并从中恢复。
    图3停止作业   
    ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001150607617.png "点击放大")
    图4恢复保存点   
    ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001103767904.png "点击放大") 
   
 
