flink根据checkpoints状态恢复数据

说明

本篇文章记录自己在工作中使用flink做实时计算遇到重启问题。

本文基于flink消费kafak数据,经过处理转化以后,最终数据落到ES数据库,

在flink程序中已经启用了checkpoints

//  默认checkpoint功能是disabled的 想要使用的时候需要先启用 每隔1000 ms进行启动一个检查点【设置checkpoint的周期】
      env.enableCheckpointing(60000)
      // 高级选项:// 设置模式为exactly-once (这是默认值)
      env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE)
      // 确保检查点之间有至少500 ms的间隔【checkpoint最小间隔】
      env.getCheckpointConfig.setMinPauseBetweenCheckpoints(30000)
      // 检查点必须在一分钟内完成,或者被丢弃【checkpoint的超时时间】
      env.getCheckpointConfig.setCheckpointTimeout(60000)
      // 同一时间只允许进行一个检查点
      env.getCheckpointConfig.setMaxConcurrentCheckpoints(1)
      //表示一旦Flink处理程序被cancel后,会保留Checkpoint数据,以便根据实际需要恢复到指定的Checkpoint【详细解释见备注】
      env.getCheckpointConfig.enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
      //RETAIN_ON_CANCELLATION:表示一旦Flink处理程序被cancel后,会保留Checkpoint数据,以便根据实际需要恢复到指定的Checkpoint
      //DELETE_ON_CANCELLATION: 表示一旦Flink处理程序被cancel后,会删除Checkpoint数据,只有job执行失败的时候才会保存checkpoint

1、启动flink程序

flink有两种运行模式,一种是运行在yarn上面,另一种是本地。

本文使用的是运行在yarn上面,通过编写启动脚本,指定参数

[bigdata@cdh03 /bigdata/flink-1.7.2-client/sh]$cat submit-flink-yarn-merge.sh
#!/bin/bash
​
#-m 运行模式,这里使用yarn-cluster,即yarn集群模式。
#-ys slot个数。
#-ynm Yarn application的名字。
#-yn task manager 数量。-yn并不能决定TaskManager的数量。其实在flink-1.7版本提交任务的时候就可以通过日志信息发现这个参数是弃用的
#-yjm job manager 的堆内存大小。
#-ytm task manager 的堆内存大小。
#-d detach模式。可以运行任务后无需再控制台保持连接。
#-c 指定jar包中class全名
# yn(实际) = Math.ceil(p/ys)
#ys(总共) = yn(实际) * ys(指定)
#ys(使用) = p(指定)
#-yn 3 \
#-ys 2 \
currentTime=$(date '+%Y%m%d%H%M%S')
echo $currentTime
../bin/flink run \
-m yarn-cluster \
-ynm flinkwaring$currentTime \
-ys 1 \
-p 4 \
-yjm 1024m \
-ytm 1024m \
-d \
-c com.gs.task.Launcher ../task/flinkETL-1.0-SNAPSHOT-jar-with-dependencies.jar --path ../resource/system.properties

启动

sh submit-flink-yarn-merge.sh

提交flink作业到yarn集群 ,

2、查看作业状态

启动flink作业会生成唯一的作业ID:application_1620268393309_0278

在yarn的webui页面查看

http://192.168.8.23:8088/

通过观察状态,看一看见新生成的作业running,一切正常


3、模拟发送数据至kafka

开始模拟往kafka发送消息,我这里启动了一个消费者,用于观察发送的消息

4、查看落库数据

正常情况下,flink监控到kafak端有消息产生,就会进行消费处理,处理结束,将数据写入ES,可以在ES可以查询到1条记录

5、在hadopp 上面查询checkpoints保存点

由于我在程序中设置了检查点并设置了检查点保存地方hdfs,通过登录hdfs查看

可以看见每隔1分钟数据做了一个checkpoints检查点

6、模拟flink作业挂了

此时,我们通过kill application_1620268393309_0278作业,模拟flink作业挂了

7、继续往kafka 发送两条数据

此时由于flink作业挂了 我们ES数据库只有一条数据,后面两条数据需要通过重启flink程序自动恢复消费,我们不能像刚开始一样直接启动程序,需要从原先停止的状态中恢复flink的消费状态

8、准备恢复flink作业

查询hdfs上最后一次checkpoints

在启动的时候指定checkpoints,通过-s checkpoints保存信息

-s hdfs://mscluster/flink/checkpoints/d97c6eeacb4b5713e5e51d785d02d4f8/chk-7/_metadata

9、指定checkpoints以后启动恢复作业

启动恢复脚本

10、查看恢复后的作业

application_1620268393309_0279

11、检查

等待一会,查看ES数据 flink是否从上次停止的地方继续处理数据

经过等待几秒钟以后。。。

此时我们观察到,ES数据库总共有三条记录,说明flink按照我们设置的检查点恢复了数据,成功消费了后面产生的两条数据。

继续往kafka发送两条数据

查看ES的结果

至此,程序一切正常,本次基于检查点的消息恢复测试完毕。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值