概述
Spark的离线作业进行编排主要有两种:
第一种是使用Linux的crontab定时任务;
第二种是使用组件(例如Oozie)进行编排。
各自优缺点:
crontab的优点是简单易行,缺点是如果多个作业之间存在先后关系,较难实现(比如前一个任务执行结束后,创建一个文件夹,后一个任务检测到文件夹后开始执行);
Oozie的优点是较好地解决了多个Spark任务统筹编排,缺点是使用比较复杂。
crontab方案
使用crontab进行Spark任务编排比较简单,可以参考如下网址:
https://www.jianshu.com/p/1c4b44737182
http://www.linuxdown.net/command/2017/1104/15360.html
具体步骤如下:
1、将需要执行的spark-submit命令编写为shell,如下shell中获取前一天的utc起始时间作为spark程序的参数,将sparkShell.sh上传到/root/spark目录下;
#!/bin/sh
#引入环境变量
source /etc/profile
#获取昨天日期
day=`date -d yesterday +%Y-%m-%d`
#拼装昨天0时0分0秒和23时59分59秒
starttime="${day} 00:00:00"
endtime="${day} 23:59:59"
#将年月日时分秒转为UTC
startutc=`date -d "${starttime}" +%s`
endutc=`date -d "${endtime}" +%s`
#执行数据清洗任务
spark-submit --master yarn-client --class com.example.officerscar.spark.offline.DataCleaningJob --num-executors 4 --executor-memory 2G --total-executor-cores 16 /root/datacleaning.jar ${startutc} ${endutc} > /root/spark/${day}.txt
2、编辑crontab,首先执行crontab –e,进入vim界面,然后执行1 0 * * * . /root/spark/sparkShell.sh。表示每天凌晨00:01开始执行sparkShell.sh。可通过crontab -l命令查看是否编辑成功。其中后半部分的执行很容易理解,前半部分的理解见下图:
举例如下:
1)每五分钟运行命令
*/5 * * * * . /home/XXXX.sh
2)每个工作日23:59都进行备份作业。
59 11 * * 1,2,3,4,5 . /home/XXXX.sh
3 )每分钟运行一次命令
*/1 * * * * . /home/XXXX.sh
4)每个月的1号 14:10 运行
10 14 1 * * . /home/XXXX.sh
3、重启crond服务
service crond restart