通过Flink实现Cassandra数据同步到redis缓存实战之二:Flink任务的定时提交

摘要

把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缓存数据幂等性设计

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值