• Linux命令之Crontab定时任务,利用Crontab定时执行spark任务




    相关内容原文地址:

    CSDN:Trigl:使用Crontab定时执行Spark任务
    思否:浩Coding:Linux命令之Crontab——定时任务



    一、Linux命令之Crontab定时任务

    crontab命令被用来提交和管理用户的需要周期性执行的任务,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

    crontab文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

    minute hour day month week command 顺序:分 时 日 月 周
    
    1. minute: 表示分钟,可以是从0到59之间的任何整数。
    2. hour:表示小时,可以是从0到23之间的任何整数。
    3. day:表示日期,可以是从1到31之间的任何整数。
    4. month:表示月份,可以是从1到12之间的任何整数。
    5. week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
    6. command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

    在以上各个字段中,还可以使用以下特殊字符:

    • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
    • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
    • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
    • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

    在这里插入图片描述

    1.1 常见Crontab任务

    1.1.1 安装crontab

    yum install`crontabs`
    

    1.1.2 查看定时任务列表

    crontab-l 
    

    1.1.3 编辑定时任务

    crontab –e【等同于: `vim` `/var/spool/cron/root`】
    

    1.1.4 删除定时任务

    `crontab``–r`
    

    1.1.5 备份定时任务

    `crontab` ` -l > $HOME/backMyCrontab `
    

    crontab服务操作说明:

    • service crond start //启动服务
    • service crond stop //关闭服务
    • service crond restart //重启服务
    • service crond reload //重新载入配置
    • service crond status//查看crontab服务状态

    1.2 Crontab命令​执行时间的网站

    https://tool.lu/crontab/

    在这里插入图片描述

    1.3 crontabl实例

    每隔2分钟输出当前时间到文件

    */2 * * * * echo $(date) >> /test/date.log
    

    每周一的凌晨4点备份Crontab到指定目录的以当前日期命名的文件

    0 4 * * 1 crontab -l > /backup/backMyCrontab/backMyCrontab-$(date +%Y-%m-%d).log
    

    在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup

    0 6-12/3 * 12 * /usr/bin/backup
    

    每天3-5,17-20每隔30分钟同步一次互联网时间,并且不输出日志到crontab将结果输出到log

    echo "*/30 [3-5],[17-20] * * * /usr/bin/ntpstat time.windows.com >/dev/null 2>&1" >> /var/cron.log
    

    每隔两天的上午8点到11点的第3和第15分钟执行command

    3,15 8-11 */2 * * command
    

    每个星期一的上午8点到11点的第3和第15分钟执行command

    3,15 8-11 * * 1 command
    

    每周六、周日的1:10重启smb

    10 1 * * 6,0 /etc/init.d/smb restart
    

    每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。

    00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} ;
    

    每小时执行/etc/cron.hourly目录内的脚本

    01 * * * * root run-parts /etc/cron.hourly
    

    1.4 注意:

    如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

    新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

    当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。

    千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。

    在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+%Y%m%d’。

    二、在Java程序中调用Linux命令

    主要用到两个类Process和Runtime,代码示例如下:

        Runtime rt = Runtime.getRuntime();
        String[] cmd = { "/bin/sh", "-c", "cd ~" };
        Process proc = rt.exec(cmd);
        proc.waitFor();
        proc.destroy();
    

    三、每天0点30分执行Spark任务

    编写执行Spark任务的Perl脚本:getappinfo.pl:

    #!/usr/bin/perl
    
    use strict;
    
    # 获取上一天的日期
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 3600 * 24);
    # $year是从1900开始计数的,所以$year需要加上1900;
    $year += 1900;
    # $mon是从0开始计数的,所以$mon需要加上1;
    $mon += 1;
    
    
    print "$year-$mon-$mday-$hour-$min-$sec, wday: $wday, yday: $yday, isdst: $isdst
    ";
    
    sub exec_spark
    {
        my $dst_date = sprintf("%d%02d%02d", $year, $mon, $mday);
        my $spark_generateapp = "nohup /data/install/spark-2.0.0-bin-hadoop2.7/bin/spark-submit  --master spark://hxf:7077  --executor-memory 30G --executor-cores 24  --conf spark.default.parallelism=300 --class com.analysis.main.GenAppInfo  /home/hadoop/jar/analysis.jar $dst_date > /home/hadoop/logs/genAppInfo.log &";
        print "$spark_generateapp
    ";
    
        return system($spark_generateapp);
    }
    
    if (!exec_spark())
    {
        print "done
    ";
        exit(0);
    }
    
    1. 添加定时器任务:每天的0点30分执行getappinfo.pl
    crontab -e
    

    添加以下内容:

    30 0 * * * /data/tools/getappinfo.pl
    
    1. 脚本中的Spark程序如下:
    package com.analysis.main
    
    import org.apache.spark.SparkConf
    import org.apache.spark.sql.SparkSession
    
    object TestCrontab {
    
      // args -> 20170101
      def main(args: Array[String]) {
    
        if (args.length == 0) {
          System.err.println("参数异常")
          System.exit(1)
        }
    
        val year = args(0).substring(0, 4)
        val month = args(0).substring(4, 6)
        val day = args(0).substring(6, 8)
    
        //设置序列化器为KryoSerializer,也可以在配置文件中进行配置
        System.setProperty("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    
        // 设置应用名称,新建Spark环境
        val sparkConf = new SparkConf().setAppName("GenerateAppInfo_" + args(0))
        val spark = SparkSession
          .builder()
          .config(sparkConf)
          .enableHiveSupport()
          .getOrCreate()
        println("Start " + "GenerateAppInfo_" + args(0))
    
        import spark.sql
    
        sql("use arrival")
        val sqlStr = "select opttime, firstimei, secondimei, thirdimei, applist, year, month, day from base_arrival where year=" + year + " and month=" + month + " and day=" + day
        sql(sqlStr).show()
    
        // 跑GenAppInfoNew
        val rt = Runtime.getRuntime()
        val cmd = Array("/bin/sh", "-c", "/data/tools/getappinfo_new.pl")
        try {
          val proc = rt.exec(cmd)
          proc.waitFor()
          proc.destroy()
          println("执行提取appinfo_new任务")
        } catch {
          case e: Exception => println("执行提取appinfo_new任务失败:" + e.getMessage())
        }
      }
    
    }
    
  • 相关阅读:
    学习jQuery必须知道的几种常用方法
    Jquery技巧总结
    代码测试
    NOIP2003 神经网络
    NOIP2003 传染病控制
    NOIP2003 加分二叉树
    NOIP2004 虫食算
    NOIP2004 合唱队列
    NOIP2004 合并石子
    NOIP2004 津津的储蓄计划
  • 原文地址:https://www.cnblogs.com/aixing/p/13327275.html
Copyright © 2020-2023  润新知