Datastage 使用shell脚本结合Sequence 实现调度案例

浏览: 4098

版本:IBM InfoSphere DataStage V11.3.1

操作系统:linux redhat 6.4

场景:

公司之前没有特定的调度工具来承载,Datastage 作业调度。导致就有了下面这一篇,关于用shell 结合Datastage  Sequence 实现调度。

shell 脚本主要用来1 :获取参数:(前后两天,为了做增量加载)2:DWI 中间落地,(自动创建文件)3:重置作业状态。

Sequence   配置依赖,并设定调度日期。自然日或是特定日期。

DataStage调度工具大比拼:

目前市面上有不少的ETL调度工具,包括control-m、taskctl、moia、ETL-PLUS、WFT、IBM自带调度工具。这里面性能最强的是control-m,界面更易操作的是taskctl,当然taskctl,moia,etl-plus也都有各自的特点,符合国内客户使用习惯。IBM自带的调度工具虽然免费,但不易使用和维护,很少有客户采用。目前从客户的反馈来看,特大型客户更愿意选择control-m,未来国产调度工具要想性能、效率、稳定性、大作业数、大并发数上得到突破,还需要加强内修,从代码编程上多练功夫。


分析:

在数据仓库中设计调度的时候,相应会考虑到整个数据架构层面的体系比如(分层存储),包括特定的业务场景比如(特定交易日,或者月报,季报)等。

数据架构流程图:

Clipboard Image.png


调度实现流程图:

Clipboard Image.png

Clipboard Image.png


Shell脚本如下:

声明:BUSINESS_DATE_TABLE 为日志表

          ETL_JOB_LOG  交易表 获取交易日期

         

#!/bin/sh
set -x
#uthor: 要选就选S型
#Created: 2015-06-01
#Usage:使用命令调用ds作业
#引用dsenv
#自动手动合并
dsname=工程名称
jobname=作业名称
erno=$?
#etl控制数据库连接信息
etl_name=实例名
etl_uname=账户名称
etl_passwd=密码

#加载环境变量信息
source /ds/informationServer/Server/DSEngine/dsenv
echo '-----------------跑批的前一天'
before_date=`sqlplus -s $etl_uname/$etl_passwd@$etl_name << !
set colsep' ' echo off feedback off heading off pagesize 0 linesize 80 numwidth 12 termout off timing off trimout on trimspool on;
select to_char(sysdate-1,'yyyymmdd') from dual;
exit
!` --获取调度的前一天也就是20160303日期
echo $before_date



echo '-----------------连接数据库'
v_id=`sqlplus -s $etl_uname/$etl_passwd@$etl_name << !
set colsep' ' echo off feedback off heading off pagesize 0 linesize 80 numwidth 12 termout off timing off trimout on trimspool on;
select to_char(sysdate,'yyyymmddhh24miss') from dual;
exit
!`
echo $v_id --获取当前一个时间戳20160304122726

v_flag=`sqlplus -s $etl_uname/$etl_passwd@$etl_name << !
set colsep' ' echo off feedback off heading off pagesize 0 linesize 80 numwidth 12 termout off timing off trimout on trimspool on;
select 1 from BUSINESS_DATE_TABLE where CALENDAR_DATE=$before_date;
exit
!`
echo $v_flag --将调度前一天的日期等于交易日期也就是20160303

echo '获取上一个工作日'
etl_date_l=`sqlplus -s $etl_uname/$etl_passwd@$etl_name << !
set colsep' ' echo off feedback off heading off pagesize 0 linesize 80 numwidth 12 termout off timing off trimout on trimspool on;
select max(CALENDAR_DATE) from BUSINESS_DATE_TABLE where CALENDAR_DATE<$before_date;
exit
!`
echo $etl_date_l --获取上一个工作日也就是20160302

echo '-----------------获取上一个成功交易日'
v_max_suc_date=`sqlplus -s $etl_uname/$etl_passwd@$etl_name << !
set colsep' ' echo off feedback off heading off pagesize 0 linesize 80 numwidth 12 termout off timing off trimout on trimspool on;
select max(etl_date) from ETL_JOB_LOG where is_valid='2' and JOB_ID= '$jobname' and etl_date<$before_date;
exit
!`
echo $v_max_suc_date --获取执行成功的也就是获取20160302的

echo '----------------手动,自动状态--1自动--2手动'
v_run_type=`sqlplus -s $etl_uname/$etl_passwd@$etl_name << !
set colsep' ' echo off feedback off heading off pagesize 0 linesize 80 numwidth 12 termout off timing off trimout on trimspool on;
select case when to_char(sysdate,'hh24') <7 then '1' else '2' end from dual;
exit
!`
echo $v_run_type --判定当前运行是手动还是自动执行,要输入给目标表,用来查看相应信息

echo '----------------判断是否正在执行'
v_is_valid=`sqlplus -s $etl_uname/$etl_passwd@$etl_name << !
set colsep' ' echo off feedback off heading off pagesize 0 linesize 80 numwidth 12 termout off timing off trimout on trimspool on;
select max(is_valid) from ETL_JOB_LOG where JOB_ID= '$jobname' ;
exit
!`
echo $v_is_valid --对应的执行状态比如1 则为执行OK,2为预警 3为失败 9直接跳出循环,没有吊起!


if [ $v_is_valid -ne 1 ] && [ $v_flag -eq 1 ] && [ $v_max_suc_date -eq $etl_date_l ] ; --确定前一个工作日执行调度OK则开始触发下面工作

then





#创建文件夹
if [ ! -d /idl/data/$before_date ] ;then
mkdir /idl/data/$before_date
fi
#创建日志目录
if [ ! -d /idl/log/$jobname ] ;then
mkdir /idl/log/$jobname
fi
#创建日志文件
if [ ! -f "/idl/log/$jobname/$before_date.log" ]; then
touch /idl/log/$jobname/$before_date.log
fi
chmod 777 /idl/log/$jobname/$before_date.log
logfile=/idl/log/$jobname/$before_date.log
echo $logfile

#修改update_time

sqlplus -s $etl_uname/$etl_passwd@$etl_name <<SQLEOF
whenever oserror exit rollback;
whenever sqlerror exit rollback;
set linesize 200;
set timing on
insert into ETL_JOB_LOG ( ID,JOB_ID,RUN_TYPE,ETL_DATE,START_DATE,IS_VALID,UPDATE_DATE) values ('$v_id','$jobname','$v_run_type','$before_date',sysdate,'1',sysdate);
commit;
quit;
SQLEOF



#echo $v_end_time


--获取交易日期是 201660302 和20160303 的时间,并赋值给自定义参数 ETL_DATE 和 ETL_DATE_L
if [ $jobname ] ;
then
echo 'job调用开始-----------------------'>>$logfile
echo `date +"%Y-%m-%d %T"` $jobname started >>$logfile

--作业重置
/ds/informationServer/Server/DSEngine/bin/dsjob -run -mode RESET -param \$ETL_DATE=$before_date -param \$ETL_DATE_L=$etl_date_l $dsname $jobname >>$logfile 2>&1

/ds/informationServer/Server/DSEngine/bin/dsjob -run -mode NORMAL -param \$ETL_DATE=$before_date -param \$ETL_DATE_L=$etl_date_l -warn 100000000 -jobstatus $dsname $jobname>>$logfile 2>&1
if [ $? -eq 1 -o $? -eq 2 ] ; then
erno=0 --成功和预警的话,返回0
echo `date +"%Y-%m-%d %T"` $jobname run successfully >>$logfile
sqlplus -s $etl_uname/$etl_passwd@$etl_name <<SQLEOF
whenever oserror exit rollback;
whenever sqlerror exit rollback;
set linesize 200;
set timing on
update ETL_JOB_LOG set IS_VALID='2',UPDATE_DATE=sysdate,END_DATE=sysdate where JOB_ID='$jobname' AND ID='$v_id';
commit;
quit;
SQLEOF
else
erno=1 --失败的话
echo `date +"%Y-%m-%d %T"` $jobname run failed >>$logfile
sqlplus -s $etl_uname/$etl_passwd@$etl_name <<SQLEOF
whenever oserror exit rollback;
whenever sqlerror exit rollback;
set linesize 200;
set timing on
update ETL_JOB_LOG set IS_VALID='3',UPDATE_DATE=sysdate,END_DATE=sysdate where JOB_ID='$jobname' AND ID='$v_id';
commit;
quit;
SQLEOF

fi
echo '***********************'>>$logfile
else
echo "Parameter is wrong ,pls type jobname"
fi
else --9,直接跳出循环,没有吊起!
sqlplus -s $etl_uname/$etl_passwd@$etl_name <<SQLEOF
whenever oserror exit rollback;
whenever sqlerror exit rollback;
set linesize 200;
set timing on
insert into ETL_JOB_LOG ( ID,JOB_ID,RUN_TYPE,ETL_DATE,START_DATE,IS_VALID,UPDATE_DATE) values ('$v_id','$jobname','$v_run_type','$before_date',sysdate,'9',sysdate);
commit;
quit;
SQLEOF
exit 0
fi


Datastage 设置:

Clipboard Image.png

Clipboard Image.png

推荐 5
本文由 我是最优雅的杀手,不杀人专杀狗 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

6 个评论

产品很高呀,谢谢
产出
非常不错,学习
恩,对上面内容有疑问可以直接留言沟通。
恩,对上面内容有疑问可以直接留言沟通。
表结构能否共有,谢谢

要回复文章请先登录注册