牛骨文教育服务平台(让学习变的简单)
博文笔记

shell封装kylin调度

创建时间:2017-12-15 投稿人: 浏览次数:277
#!/bin/bash

if [ $# -lt 2 ]; then
        echo "请输入正确的参数,输入的参数必须为3个或者4个!!!"
        echo "参数1:刷新数据的结束时间,代表下文的T, 例如:20170101,
              参数2:刷新cube的名称 例如:kylin_scample_cube,
              参数3:刷新cube的周期,目前仅仅支持D,W,M,Y四种类型,分别对应着"天","周","月","年",
              参数4:回刷时间,目前仅仅支持数字类型,例如:9"
        echo -e "
"
        echo "ps:需要另外补充一下参数3和参数4的说明, 如果参数4不传递,则说明不回刷数据,默认只增量刷新,
                 如果参数3输入D,参数4不输入,则说明该cube只刷新T-1到T的数据,不回刷历史数据, 如果参数4输入数字N,则代表刷新T-1,并且回刷T-1到T-N的数据
                 如果参数3输入W,参数4不输入,则说明该cube只刷新T- 1 week到T的数据,不回刷历史数据,如果参数4输入数字N ,则代表刷新T-1 week到T的数据,并且回刷前N周的数据
                 如果参数3输入M,参数4不输入,则说明该cube只刷新T-1month到T的数据,不回刷历史数据, 如果参数4输入数字N,则代表刷新T-1 month到T的数据,并且回刷前N个月的数据
                 如果参数3输入Y,参数4不输入,则说明该cube只刷新T-1year到T的数据,不回刷历史数据, 如果参数4输入数字N,则代表刷新T-1 year到T的数据,并且回刷前N个月的数据"
        exit 2
fi

#定义目录
dire="/tmp/kylinlogs/"
if [ -d "$dire" ]; then
echo "目录存在,不需要创建!"
else
mkdir "$dire"
echo "目录不存在,已创建!"
fi

#获取八小时所对应的毫秒值
kylinMinusTime=$((8 * 60 * 60 * 1000))
#echo "kylinMinusTime is :" $kylinMinusTime
#传入的cube名称
cubeName=$1
echo "cubeName is(cube的名称为):" $cubeName

#全量刷新all或者增量刷新increment
freshtype=$2
echo "freshtype is :"$freshtype


#获取结束时间所对应的毫秒值
if [ ! -n "$3" ] ;then
        echo "该cube是全量刷新"
else
    #echo "该cube是增量刷新"
        enddate=$3
    enddate1=`date -d"$enddate" +%Y%m01`
    endday=`date -d"1 day $enddate" +%Y%m%d`
fi
#end=$[$(date -d "$3" +%s%N)/1000000]
#echo "end is:(传入的结束时间为)" $endday

#如果是增量刷新,则说明回刷周期, 如果不回刷,则不需要传递该参数
if [ ! -n "$4" ] ;then
        RefreshTime=0
else
        RefreshTime=$4
fi

current_date=`date +%Y%m%d`
#定义接收ip地址的变量
ipaddr=ip:7070

#定义一个数组存储kylinuuid
arr_uuid=()

#定义一个数组存储kylinstatus
arr_status=()

if [ $freshtype == "all" ];then
    curl -X PUT -H "Authorization: Basic QURNSU46S1lMSU4=" -H "Content-Type: application/json;charset=UTF-8" -d "{"startTime":0, "endTime":0, "buildType":"BUILD"}" http://$ipaddr/kylin/api/cubes/$cubeName/rebuild &> /tmp/kylinlogs/$cubeName"_"$freshtype"_"$current_date

    #获取全量刷新的job的uuid
    arr_uuid[0]=`grep -Po "uuid[" :]+K[^"]+" "/tmp/kylinlogs/"$cubeName"_"$freshtype"_"$current_date`

elif [ $freshtype == "increment" ];then
    #如果是增量的话,就判断是否需要回刷上个月的数据,默认会回刷当前月1号到当前天的数据
    for((i=0;i<=$RefreshTime;i++))
            do
            #$date +%Y%m -d "`date +%Y%m`01 -1 month"
            if [ $i -ne 0 ];then
                echo "i is :"$i
                freshstartday=`date -d "$i month ago $enddate1" +%Y%m01`
                echo "freshstartday is :" $freshstartday
                start1=$[$(date -d $freshstartday +%s%N)/1000000]
                        startTime=$(($start1 + $kylinMinusTime))
                echo "startTime is :" $startTime
               freshendday=`date -d "1 month $freshstartday" +%Y%m01`
                echo "freshendday is :" $freshendday
                freshend=$[$(date -d $freshendday +%s%N)/1000000]
                        endTime=$(($freshend + $kylinMinusTime))
                echo "endTime is :"$endTime
            else
                echo "i is :"$i
                 freshstartday=`date -d "$i month ago $enddate1" +%Y%m01`
                echo "freshstartday is :" $freshstartday
                start1=$[$(date -d $freshstartday +%s%N)/1000000]
                                startTime=$(($start1 + $kylinMinusTime))
                echo "startTime is :" $startTime

                freshendday=$endday
                echo "freshendday is :" $freshendday
                freshend=$[$(date -d $freshendday +%s%N)/1000000]
                                endTime=$(($freshend + $kylinMinusTime))
                echo "endTime is :"$endTime
            fi
 curl -X PUT -H "Authorization: Basic QURNSU46S1lMSU4=" -H "Content-Type: application/json;charset=UTF-8" -d "{"startTime":"$startTime", "endTime":"$endTime", "buildType":"BUILD"}" http://$ipaddr/kylin/api/cubes/$cubeName/rebuild &> /tmp/kylinlogs/$cubeName"_"$freshtype"_"$freshstartday"_"$freshendday

            arr_uuid[$i]=`grep -Po "uuid[" :]+K[^"]+" "/tmp/kylinlogs/"$cubeName"_"$freshtype"_"$freshstartday"_"$freshendday`
            done
else
    echo "参数只能为all或者increment,请检查参数信息!!!"
    exit 2
fi

#根据job的uuid获取job的状态
while true
do
    if [ $freshtype == "all" ];then
        uuid=${arr_uuid[0]}
        curl -X GET -H "Authorization: Basic QURNSU46S1lMSU4=" -H "Content-Type: application/json;charset=UTF-8" http://$ipaddr/kylin/api/jobs/$uuid &> /tmp/kylinlogs/$cubeName"_"$freshtype"_"$uuid".json"
        arr_status[0]=`grep -Po "job_status[" :]+K[^"]+" "/tmp/kylinlogs/"$cubeName"_"$freshtype"_"$uuid".json"`
    elif [ $freshtype == "increment" ];then

        for((i=0;i<${#arr_uuid[*]};i++))
            do
                    # echo "fresh job uuid is:"${arr[$i]}
                    uuid=${arr_uuid[$i]}
                    curl -X GET -H "Authorization: Basic QURNSU46S1lMSU4=" -H "Content-Type: application/json;charset=UTF-8" http://$ipaddr/kylin/api/jobs/$uuid &> /tmp/kylinlogs/$cubeName"_"$freshtype"_"$uuid".json"
                    arr_status[i]=`grep -Po "job_status[" :]+K[^"]+" "/tmp/kylinlogs/"$cubeName"_"$freshtype"_"$uuid".json"`
            done
    fi

#获取被手动放弃的job个数
        discardsize=`echo ${arr_status[@]}| grep -o "DISCARDED" | grep -c "DISCARDED"`

        #获取错误job个数
        errorsize=`echo ${arr_status[@]}| grep -o "ERROR" | grep -c "ERROR"`

        #获取完成的job个数
        finishedsize=`echo ${arr_status[@]}| grep -o "FINISHED" | grep -c "FINISHED"`

        #获取正在运行的job个数
        runningsize=`echo ${arr_status[@]}| grep -o "RUNNING" | grep -c "RUNNING"`

        #获取等待的job个数
        pendingsize=`echo ${arr_status[@]}| grep -o "PENDING" | grep -c "PENDING"`
#判断job的状态和job状态的个数等,根据规则,退出程序或者是继续监控运行
        if echo "${arr_status[@]}" | grep -w "ERROR" &>/dev/null; then
                echo "有"$finishedsize"个FINISHED的job, 有"$runningsize"个RUNNING的job,有"$discardsize"个DISCARDED的job, 有"$errorsize"个ERROR的job, 有"$pendingsize"个PENDING的job!!!"
                 echo "This $cubeName fresh is error,At least one job status is error , please double check!!!"
                exit 1
         elif [ $RefreshTime == $(($finishedsize-1)) ];then
                echo "有"$finishedsize"个FINISHED的job, 有"$runningsize"个RUNNING的job,有"$discardsize"个DISCARDED的job, 有"$errorsize"个ERROR的job, 有"$pendingsize"个PENDING的job!!!"
                echo "This $cubeName fresh is finished,job status is finished!"
                exit 0
        elif [ $RefreshTime == $(($discardsize-1)) ];then
                echo "有"$finishedsize"个FINISHED的job, 有"$runningsize"个RUNNING的job,有"$discardsize"个DISCARDED的job, 有"$errorsize"个ERROR的job, 有"$pendingsize"个PENDING的job!!!"
                echo "This $cubeName all of job status is discarded , please double check!!!"
                exit 1
        elif [ $RefreshTime == $(($discardsize-1+$finishedsize)) ];then
                echo "有"$finishedsize"个FINISHED的job, 有"$runningsize"个RUNNING的job,有"$discardsize"个DISCARDED的job, 有"$errorsize"个ERROR的job, 有"$pendingsize"个PENDING的job!!!"
                echo "this $cubeName has $finishedsize job status is finished , but has $discardsize job status is discarded ,pleace double check!!!"
                sleep 5s
                exit 0
    elif [ $(($discardsize+$errorsize+$finishedsize+runningsize+pendingsize)) == 0 ];then
        echo "该作业没有被调起来,发生了异常,请检查日志信息$KYLIN_HOME/logs/kylin.log , 同时也请检查/tmp/kylinlogs/"$cubeName"_"$freshtype"_"$freshstartday"_"$freshendday
        exit 0
        else
                #echo "有"$finishedsize"个FINISHED的job, 有"$runningsize"个RUNNING的job,有"$discardsize"个DISCARDED的job, 有"$errorsize"个ERROR的job, 有"$pendingsize"个PENDING的job!!!"
        #echo "This $cubeName is running ,job status is running!"
                sleep 5s
                #echo -e "
"
                continue
        fi
done
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。