首页 > 其他分享 >任务调度之Azkaban

任务调度之Azkaban

时间:2023-06-03 09:23:21浏览次数:40  
标签:任务调度 任务 crontab azkaban job 执行 Azkaban

针对数据仓库中的任务脚本我们前面已经整理过了,任务脚本还是比较多的,针对初始化表的脚本只需要执行一次即可,其它的脚本需要每天都执行一次,这个时候就需要涉及到任务定时调度了。

Crontab调度器的使用

咱们前面在学习Linux的时候学过一个crontab调度器,通过它可以实现定时执行指定的脚本。
针对我们这个数据仓库中的这些脚本使用crontab进行调度是可以的

但是需要注意一点:这些任务之间是有一些依赖关系的,从大的层面上来说,dwd层的任务需要等ods层的任务执行成功之后才能开始执行

那crontab如何知道任务之间的依赖关系呢?

crontab是无法知道任务之间的依赖关系的,我们只能间接实现

举个例子:针对MapReduce任务和Spark任务,任务执行成功之后,在输出目录中会有一个success标记文件,这个文件表示这个任务成功的执行结束了。

此时如果我们使用crontab调度两个job,一个jobA,一个jobB,先执行jobA,jobA成功执行结束之后才能执行jobB,这个时候我们就需要在脚本中添加一个判断,判断jobA的结果输出目录中是否存在success文件,如果存在则继续执行jobB,否则不执行,并且告警,提示jobA任务执行失败。

那我们现在执行的是hive的sql任务,sql任务最终不会在输出目录中产生success文件,所以没有办法使用这个标记文件进行判断,不过sql任务会产生数据文件,数据文件的文件名是类似000000_0这样的,可能会有多个,具体的个数是由任务中的reduce的个数决定的,我们也可以选择判断这个数据文件是否存在来判断任务是否成功执行结束。

注意了:针对SQL任务虽然可以通过判断数据文件来判定任务是否执行成功,不过这种方式不能保证100%的准确率,有可能会存在这种情况,任务确实执行成功了,但是在向结果目录中写数据文件的时候,写了一半,由于网络原因导致数据没有写完,但是我们过来判断000000_0这个文件肯定是存在的,那我们就误以为这个任务执行成功了,其实它的数据是缺失一部分的,不过这种情况的概率极低,可以忽略不计。

如果项目中的定时任务有很多,使用crontab虽然可以实现任务依赖的功能,但是管理起来不方便,

crontab没有提供图形化的界面,使用起来比较麻烦

针对一些简单的定时任务的配置,并且任务比较少的情况下使用crontab是比较方便的。

Azkaban调度器的使用

Azkaban介绍

在实际工作中如果需要配置很多的定时任务,一般会采用一些支持界面操作的调度器,例如:Azkaban、Ooize

Azkaban是一个轻量级的调度器,使用起来比较简单,容易上手。
Ooize是一个重量级的调度器,使用起来相对比较复杂。

在这里我们主要考虑易用性,所以我们选择使用Azkaban。

下面我们来快速了解一下Azkaban,以及它的用法。

Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。
Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。

安装部署

官网下载的Azkaban是源码,需要编译,没有提供二进制文件。

下载

wget https://github.com/azkaban/azkaban/archive/refs/tags/3.73.0.tar.gz

安装Git

yum ‐y install git
yum ‐y install gcc‐c++

修改azkaban目录下的build.gradle文件,修改allprojects节点配置,指定仓库地址为阿里云仓库

allprojects {
    apply plugin: 'jacoco'
    repositories {
       maven {
    	  	url 'https://maven.aliyun.com/repository/public/'
   	 }
    mavenLocal()
    mavenCentral()
    }
}

开始编译、安装并跳过测试阶段

./gradlew build installDist -x test

报错

Exception in thread "main" javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:214)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1958)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1915)
        at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1898)

在windows下也尝试了,也不行,最终在网上找到了一个别人编译好的(版本3.36.0),azkaban 安装,直接使用。

部署

在这里我们就使用Azkaban的solo模式部署。
solo模式属于单机模式,那对应的Azkaban也支持在多台机器上运行。

solo模式的优点:

  • 易于安装:无需MySQL示例。它将H2打包为主要的持久存储。
  • 易于启动:Web服务器和执行程序服务器都在同一个进程中运行。
  • 全功能:它包含所有Azkaban功能。

修改Azkaban的时区为上海时区,修改监听端口为9091,conf/azkaban.properties

default.timezone.id=Asia/Shanghai
jetty.port=9091

启动

bin/azkaban-solo-start.sh

停止

bin/azkaban-solo-shutdown.sh

启动成功之后,azkaban会启动一个web界面,监听的端口是9091

image

账号密码默认为 azkaban/azkaban

提交独立任务

先创建一个Project

image

向test项目中提交任务

创建一个文件hello.job,文件内容如下:

# hello.job
type=command
command=echo "Hello World!"

这里面的#号开头表示是注释
type:任务类型,这里的command表示这个任务执行的是一个命令
command:这里的command是指具体的命令
将hello.job文件添加到一个zip压缩文件中,hello.zip。

将hello.zip压缩包提交到刚才创建的test项目中

image

此时test项目中就包含hello这个任务,点击execute flow执行

image

image

image

此时这个任务执行一次就结束了,如果想要让任务定时执行,可以在这配置。

image

这就将test项目中的hello.job配置了定时任务。
其实我们会发现这里面的定时任务的配置格式和crontab中的一样。

提交依赖任务

先创建一个文件first.job

# first.job
type=command
command=echo "Hello First!"

再创建一个文件second.job,这里面通过dependencies属性指定了任务的依赖关系,后面的first表示依赖的任务的文件名称

# second.job
type=command
dependencies=first
command=echo "Hello Second!"

最后将这两个job文件打成一个zip压缩包

参考

任务调度器之Azkaban的使用
azkaban 安装

标签:任务调度,任务,crontab,azkaban,job,执行,Azkaban
From: https://www.cnblogs.com/strongmore/p/17369228.html

相关文章

  • Quartz任务调度框架
    Quartz任务调度框架Quartz是一个任务调度框架,用于定时执行任务。任务调度:系统中有N的任务,分别需要在不同的时刻执行这些任务,这种多任务的执行策略就是任务调度0定时任务实现的方法springschedule优点:无需整合spring,作业类中就可以调用业务service缺点:默认单线程执行任务......
  • SpringBoot如何整合定时任务调度
    所有的系统开发里面定时调度绝对是一个核心的话题,对于定时调用的实现在实际开发之中可以使用:TimerTask,Quartz,SpringTask配置,实际上这里面最简单的配置就是Spring自己所提供的Task处理。如果要想实现定时调度,只需要配置一个定时调度的组件类即可:1.packagecom.gwolf.task;2.3.......
  • DolohinScheduler 分布式任务调度框架 代码流程分解
    一、DS-API模块-执行工作流 -定时任务执行 更新schedule参数 -/schedule新增schedule参数做了什么事? 将schedule参数用ScheduleParam类进行解析 有效性校验,而后解析保存到t_ds_schedules表内,更新t_ds_process_definition表 -/onlin......
  • Java 几种任务调度的实现方法与比较
    几种任务调度的Java实现方法与比较综观目前的Web应用,多数应用都具备任务调度的功能。本文由浅入深介绍了几种任务调度的Java实现方法,包括Timer,Scheduler,Quartz以及JCronTab,并对其优缺点进行比较,目的在于给需要开发任务调度的程序员提供有价值的参考。 任务调度是指......
  • Quartz任务调度器详解
    关键字:介绍QuartzQuartz是一个开源的任务调度系统,它能用来调度很多任务的执行。运行环境Quartz能嵌入在其他应用程序里运行。Quartz能在一个应用服务器里被实例化(或servlet容器),并且参与XA事务Quartz能独立运行(通过JVM),或者通过RMIQuartz能......
  • 《分布式任务调度平台XXL-JOB》
    文档地址https://www.xuxueli.com/xxl-job/中文文档EnglishDocumentation源码仓库地址源码仓库地址ReleaseDownloadhttps://github.com/xuxueli/xxl-jobDownloadhttp://gitee.com/xuxueli0323/xxl-jobDownload中央仓库地址<!--http://repo1.maven.org/......
  • 分布式任务调度
     1、什么是任务调度? 我们可以先思考一下下面业务场景的解决方案:某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。某银行系统需要在信用卡到期还款日的前三天进行短信提醒。某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。12306会根......
  • activiti 工作流 quartz 任务调度
    activiti:工作流workflowquartz有四个重要的组件 1.Scheduler代表一个Quartz的独立运行容器,Scheduler将Trigger绑定到特定JobDetail,这样当Trigger触发时,对应的Job就会被调度。2.Trigger描述Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger两个子......
  • 《Linux基础》05. 定时任务调度 · 磁盘分区与挂载 · 网络配置
    目录1:定时任务调度1.1:crontab1.2:at2:磁盘分区与挂载2.1:原理介绍2.2:硬盘说明2.3:磁盘目录情况查询2.3.1:lsblk2.3.2:df2.3.3:du2.3.4:tree2.3.5:其他查看指令示例2.4:分区与挂载2.4.1:fdisk2.4.2:mkfs2.4.3:mount2.4.4:umount2.4.5:相关配置文件2.5:挂载案例2.5.1:虚拟机添加硬盘2.5.2:硬盘分区2.5.......
  • 自用纯C语言实现任务调度(可用于STM32、C51等单片机)
    前言  这个任务调度模块的实现是形成于毕设项目中的,用在STM32中,断断续续跨度2个月实现了一些基本功能,可能后面再做其他项目时会一点点完善起来,也会多学习相关知识来强化模块的实用性和高效性,毕竟用自己自主实现出来的功能还是蛮舒心的。任务调度模式结构  整体上的结构属于......