摘要
把flink项目打包上传到flink job manager服务器上之后,还需要解决一个任务定时运行的问题。本文将介绍一个定时提交flink任务的解决方案。
场景
还是那句话,在介绍解决方案的时候不说清楚场景,就算是耍流氓。所以这里还是需要把应用场景说明一下。
我们的这个数据同步需求,一个flink任务是跑不完的,需要划分成多个flink任务。主要原因是:
- 数据总量比较大,无法一次性处理那么多数据。由于数据总量是需要同步一年365天的数据,每天大约有20万条数据,总数据量是几千万接近一亿条数据。
- cassandra数据源对数据按日期进行了分区,可以按日期取数据并处理输出。
- 一个flink任务最多支持64个data sink。
所以我们的解决方案是:在一个flink任务里,处理若 N 天(可配置)的数据,整个数据同步分成 365 / N + 1个flink任务来处理。另外,由于涉及到大量数据的读写,为了降低数据库的压力,我们只有在上一个任务完成之后,再触发下一个flink任务,上一个任务如果执行成功了,那么在文件里记录下执行的记录,如果失败了,按照一定规则重试。整个过程都通过bash脚本来实现。
Flink任务的提交
Flink任务打包上传后,会被保存在:/tmp/flink-web-XXXXXXXXXX/flink-web-upload/目录下。这个目录的地址在flink管理页面上可以看到:
上传之后的文件名称也发生了变动,会增加一个前缀:6795f51d-aba3-4af7-8359-c249cc9ec23a_<原来的jar包名>.jar。我们执行flink任务的命令如下:
./bin/flink run /tmp/flink-web-*/flink-web-upload/*_<原来的jar包名>.jar
由于我们实际上实在k8s上运行flink服务,所以实际上的命令如下:
#获取k8s pod名称
flink_job_manager_pod=`kubectl get pods|grep flink-jobmanager|tail -1|awk -F " " '{print($1)}'`
#执行触发flink任务的命令
#使用 sh -c的原因是,只有这样才能支持通配符,直接kubectl exec -it <pod> <cmd> 是不支持通配符的
kubectl exec -it $flink_job_manager_pod -- sh -c "./bin/flink run /tmp/flink-web-*/flink-web-upload/*_mapGeneratingModule-*.jar"
Flink任务的出错重试
在Shell脚本中通过$?可以获取上一个命令执行的结果。通过判断这个值是否为0可以判断命令是否执行成功。
#!/bin/bash
#第一个参数是重试次数(必传)
retry=$1
#第二个参数是日志的名称(可选)
if [ ! -n "$2" ];then
logName=$((`date "+%s"`*1000+`date "+%N"`/1000000))
else
logName=$2
fi
continue=1
while [ "$continue" -ne "0" -a $retry -gt 0 ]
do
echo retry is $retry
#触发命令并写日志
`./triggerTask.sh >> $logName.log`
#获取命令执行结果
continue=$?
echo the result of the last command is $continue
retry=$(($retry - 1))
echo wait 300 secs before retry...
sleep 300
done
Flink任务的定时提交
通过Kubernetes的CronJob实现定时启动命令:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: auto-flink-job
spec:
schedule: "1 23 * * *" #每天23点01分执行
jobTemplate:
spec:
template:
spec:
containers:
- name: auto-flink-job
image: '<镜像地址>/<镜像路径>:<镜像版本>'
args:
- ./flink/autoRestartTriggerTask.sh
imagePullSecrets:
- <用户名>: <密码>
restartPolicy: OnFailure
通过Flink实现Cassandra数据同步到redis缓存实战系列文章电梯:
一:数据同步任务的实现
二:Flink任务的定时提交
三:异常处理
四:幂等性!幂等性!幂等性!Redis缓存数据幂等性设计