shell解决资源抢占的问题以及调度无法对任务进行判定是否执行
1.先来说说场景
我们有一个任务是分钟级别spark任务,他启动时无法知道前一次是否成功,然后就会不停的创建任务最后导致资源占用;而且我们现在一套集群,上面有分钟级、小时级别、天级、随机任务一起跑,无法做到分离。
2.来看一下基础的shell开发
(1)shell的if
demo 接收一个参数
sh testif.sh 1
#! /bin/bash
set -e
base=.
type=$1
if [ ! $type ]
then
echo "type is null"
elif [ $type -eq 0 ]
then
echo "type is 0"
elif [ $type -eq 1 ]
then
echo "type is 1"
else
echo "type is other"
fi
注意点:
1、每一个if 或者elif后面需要一个then
2、if 的条件判断[]中的表达式必须和[或者]留有一个字符的宽度
(2)shell脚本中比较时间的代码
#!/bin/bash
date1="180609"
date2="180610"
day=$(date "+%Y-%m-%d" -d "$date1 0 day")
echo $day
t1=`date -d "$date1" +%s`
t2=`date -d "$date2" +%s`
echo t1=$t1
echo t2=$t2
if [ $t1 -gt $t2 ]; then
echo "$date1 > $date2"
elif [ $t1 -eq $t2 ]; then
echo "$date1 == $date2"
else
echo "$date1 < $date2"
fi
3.来看我写的业务代码
给入参数时间段做的事情。请注意,这里我就学习了30分钟shell,如果说代码写的不好请指出;没有做参数校验,那就自己用吧。
#!/bin/bash
# 该参数为传入的限定时间段
time_param1="$1"
time_param2="$2"
time_param3="$3"
time_param4="$4"
echo "参数列表============="
echo "第一次实时介入时间 : $time_param1"
echo "第一次实时停止时间 : $time_param2"
echo "第二次实时介入时间 : $time_param3"
echo "第二次实时结束时间 : $time_param4"
echo "----------------------"
# 系统当前时间,格式类型为:2019-06-26 11:33:17
now_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "得到系统当前时间为:$now_time"
# 创建每天限定时间段
point_time1=$(date +"%Y-%m-%d $time_param1")
point_time2=$(date +"%Y-%m-%d $time_param2")
point_time3=$(date +"%Y-%m-%d $time_param3")
point_time4=$(date +"%Y-%m-%d $time_param4")
echo "时间区间-------==========------------"
echo "第一次实时介入时间 : $point_time1"
echo "第一次实时停止时间 : $point_time2"
echo "第二次实时介入时间 : $point_time3"
echo "第二次实时结束时间 : $point_time4"
echo "----------------------"
timestamp_now_time=`date -d "$now_time" +%s`
timestamp_point_time1=`date -d "$point_time1" +%s`
timestamp_point_time2=`date -d "$point_time2" +%s`
timestamp_point_time3=`date -d "$point_time3" +%s`
timestamp_point_time4=`date -d "$point_time4" +%s`
echo "----------------------"
echo "当前时间 : $timestamp_point_time"
echo "第一次实时介入时间 : $timestamp_point_time1"
echo "第一次实时停止时间 : $timestamp_point_time2"
echo "第二次实时介入时间 : $timestamp_point_time3"
echo "第二次实时结束时间 : $timestamp_point_time4"
echo "----------------------"
if [ $timestamp_now_time -ge $timestamp_point_time1 ] && [ $timestamp_now_time -le $timestamp_point_time2 ]; then
echo "当前时间介于第一次任务放开时间 : $point_time1 < $now_time < $point_time2"
elif [ $timestamp_now_time -ge $timestamp_point_time3 ] && [ $timestamp_now_time -le $timestamp_point_time4 ]; then
echo "当前任务开始第二次任务放开时间 : $point_time3 < $now_time < $point_time4 "
else
echo "时间区间-------==========------------"
echo "请注意,当前时间,不再任务接入时间范围内,请注意!"
echo "程序应该执行的时间段为:"
echo "时间区间-------==========------------"
echo "当前时间介于第一次任务放开时间 : $point_time1 < $now_time < $point_time2"
echo "当前任务开始第二次任务放开时间 : $point_time3 < $now_time < $point_time4 "
echo "时间区间-------==========------------"
echo "Do nothing."
echo "Error:Exception:Exception has been found.job should closed."
1=2
fi
可以看到,不用他做就让他报错即可。
azkaban自然会报错。
输出1=2
在此做版本迭代,记录于此。
4.注意事项
(1)看行号
vim 之后 esc set number
(2)如果上传.sh文件不行的话,注意修改一下文件的ff哦,不要忘记
(3)请注意,shell脚本的if else需要有空格,不然会报错的。