在没有调度器的情况下,怎么保证实时数仓任务有序执行

背景:
上次我们写到没有调度器的情况下,怎么执行数仓任务,对于每日数仓任务,一天执行一次,上下游依赖问题解决了,是没有问题的。但是对于实时或者近实时数仓任务,当集群资源紧张、数据量日益变大的时候,我们定的执行频率就无法稳定的执行了。这时候我们就需要通过规则来区分当前任务和下一次任务。

如下是我们每30分钟执行一次的近实时数仓任务:
在这里插入图片描述
1.如果上面数仓任务30min执行一次,当这个数仓任务的执行时间超过了30min,下一次任务就启动了,那两个任务会同时执行。这样就会出现一个问题,上一次任务所需的中间表或者临时表可能会被下一次任务删掉或者覆盖掉,就会导致当前使用这张表的数据重复或者数据异常。

如何避免实时任务同时被调起的问题呢?

对于调度来说,判断一个任务结束通过状态比较多。我们通过标签性文件来判断,那同理我们也可以通过标注文件来判断上个任务是否执行结束,如果没有执行结束,本次任务等待,直到标注文件判断不存在,则执行本次任务。

在我们调度中有如下star和end两个节点:

start:开始节点去判断控制文件是否存在,存在则等待20min,1min判断一次;不存在则执行任务:

#!/bin/bash
hdfs="/usr/local/service/hadoop/bin/hdfs"
${hdfs} dfs -test -e /control/realtime_applist
if [ $? -eq 0 ];then
  # 失败,上一次提交的任务还没有跑完
  echo '失败,上一次提交的任务还没有跑完'
  exit 1
else
  ${hdfs} dfs -mkdir /control/realtime_applist
  echo '提交任务成功!'
  exit 0
fi

end: 结束节点,任务结束删除控制文件

#!/bin/bash
hdfs="/usr/local/service/hadoop/bin/hdfs"
${hdfs} dfs -test -e /control/realtime_applist
if [ $? -eq 0 ];then
  # 失败,上一次提交的任务还没有跑完
  echo '任务执结束....删除'
  ${hdfs} dfs -rmdir /control/realtime_applist
  exit 0
fi

注:如果是单台节点,控制文件也可以放在本地。
关于循环判断或者关于上一篇文章,可点击
通过上述控制文件的方式,可以避免实时任务被多次调起的情况。解决了可能存在的数据重复和数据异常问题。

2.当集群故障、任务所在的调度器挂了或者任务出现问题的时候,还没有到我们end节点,那这个时候原本要删除的控制文件无法删除,就会导致下一次任务无法启动或者启动之后一直在等待上次任务的控制文件删除。

如何避免控制文件无法正常删除?

代码如下:通过判断控制文件的创建时间,如果创建时间超过1个小时(根据任务的执行时间来判断,原则上任务执行时间+允许延迟时间)则手动删除

shellname=realtime_applist

hdfs_controll="realtime_applist"
full_hdfs_controll="/control/realtime_applist"

hadoop="/usr/local/service/hadoop/bin/hadoop"
shelllogtime=`date '+%Y-%m-%d %H:%M:%S'`
vardate_current=`date '+%H'`

current_time=`date '+%s'`
vardate=`date +%Y%m%d`
vardate_hh=`date -d '1 hour ago' +%Y%m%d%H`
varcurdate=`date -d '1 day ago' +%Y%m%d`

${hadoop} fs -test -e ${full_hdfs_controll}
if [ $? -eq 0 ];then
if [ ${vardate_current} -ge '02' ] ; then
count=0
for varible in {1..3} 
do
count=$[$count + 1]
#获取控制文件创建时间
date_day=`${hadoop} fs -ls /control | grep ${hdfs_controll} | awk -F ' ' '{ print $6 }'`
date_hhmm=`${hadoop} fs -ls /control | grep ${hdfs_controll} | awk -F ' ' '{ print $7 }'`
#天数据和分时数据拼接
controll_time="${date_day} ${date_hhmm}"
#转化成秒
dateline=`date -d "${controll_time}" +%s`
#判断控制文件的创建时间和当前时间的差值
diff_value=`expr $current_time - $dateline`
num=`expr $diff_value / 3600`
current_time=`date '+%s'`
echo "当前控制文件时间为:"${controll_time}
echo "当前时间为:"${shelllogtime}

  if [ ${num} -ge 2 ]; then
    echo "控制文件超时超过2小时!!!"
    echo "执行监控次数为##########:"$count
    #如果执行监控次数为2次时,判断充值控制文件是否存在,存在则删除
    if [ ${count} -eq 2 ]; then
		${hadoop} fs -rmdir ${full_hdfs_controll}
        echo "控制文件存在"
    #如果执行监控次数为3次时,充值控制文件在第二次尝试删除未果时,则电话报警,人工干预
    elif [ ${count} -eq 3 ]; then
      #call_phone_monitor
      break
    fi
    echo "####################################执行睡眠等待!!!####################################"
    sleep 2m
  else
    echo "####################################This task is successful!####################################"
    echo "####################################当前控制文件时间为:${controll_time}####################################"
    break
  fi 
done
fi
fi

关注博主,持续更新有关内容

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值