大数据任务调度器 —— Azkaban 3.0 进阶应用

news2025/1/21 15:29:38

文章目录

        • 任务依赖
        • 任务重试
        • JavaProcess 进程任务提交
        • 条件执行
          • 自定义条件
          • 预定义条件
        • 定时执行
        • 邮件警告

前言:Azkaban 搭建以及基础介绍,查看这篇博客 —— 大数据任务调度器 —— Azkaban 3.0 部署与简单应用

任务依赖

Azkaban 中的任务依赖设置十分简单,通过 dependsOn 参数完成,如下所示:

nodes:
 - name: taskA
   type: command
   config:
     command: echo "This is taskA!"

 - name: taskB
   type: command
   config:
     command: echo "This is taskB!"

 - name: taskC
   type: command
   config:
     command: echo "This is taskC!"
   dependsOn:
     - taskA
     - taskB

如上示例中,taskC 任务依赖于 taskAtaskB,需要注意 dependsOn 参数的值为数组

执行后如下所示:

任务重试

假设我们当前的任务执行失败了,如下场景:

我们可以点击右上角的 Prepare Execution 按钮进行手动重试

在手动重试时,我们可以选择直接进行重试,也可以选择跳过某些任务进行重试,右击需要跳过重试的任务,选择 Disable,那么在重试时该任务将不会执行。

在 Azkaban 中还有自动重试,在 flow 文件中进行配置,如下所示:

nodes:
 - name: test
   type: command
   config:
     command: bash /test.sh
     retries: 2
     retry.backoff: 5000

其中 retries 表示重试的次数,retry.backoff 表示重试的时间间隔,单位是 ms 毫秒,注意缩进格式。

JavaProcess 进程任务提交

在 Azkaban 中,有两种任务类型,除了我们上面用的 command 命令行类型之外,还有 javaprocess 类型,用于提交 jar 包,其配置参数如下:

  • Xms:堆内存的初始大小,默认为物理内存的 1/64

  • Xmx:堆内存的最大大小,默认为物理内存的 1/4~1/2

  • classpath:类路径,默认和提交的 flow 文件在同一目录下。

  • java.class:要运行的 Java 对象,其中必须包含 main 方法

  • main.argsmain 方法的参数,多个参数用空格间隔。

我当前编写了如下 Java 程序用于测试。

public class hello_world {

    public static void main(String[] args) {

        String name = args[0];
        String age = args[1];

        System.out.printf("我叫%s\n今年%s岁了",name,age);
    }

}

然后将该程序打成 jar 包,提交 Azkaban 进行运行。

编写 flow 配置文件:

nodes:
 - name: test
   type: javaprocess
   config:
      Xms: 64M
      Xmx: 264M
      java.class: hello_world
      main.args: 张三 20

其余都用默认参数,和 jar 一起打入压缩包中,创建项目,进行提交。

执行完成后,日志结果如下所示:

条件执行

在 Azkaban 中实现条件流程控制功能,分为自定义条件和预定义条件。

自定义条件

使用 condition 配置项来指定设置的条件,通常会配合运行参数一起使用。

运行参数是 Azkaban 允许用户在同一个工作流中定义的环境变量,将其写入到 JOB_OUTPUT_PROP_FILE 文件中,提供给其它 Job 进行使用。例如:在 JobA 中定义的变量,能够在 JobB 中进行读取并使用。

假设我们当前要实现 JobAJobB。其中 JobB 依赖于JobA ,且 JobB 必须在周日执行。

那么,根据需求,配置了如下 flow 文件:

nodes:
 - name: JobA
   type: command
   config:
     command: sh JobA.sh
     
 - name: JobB
   type: command
   config:
     command: echo "Today is happy day!"
   dependsOn:
     - JobA
   # 判断是否为周日
   condition: ${JobA:week} == 7

JobA 中执行的 JobA.sh 脚本文件内容如下:

echo "Today is happy day!"

# 获取周几
week=`date +%w`

# 以 JSON 格式写入 Azkaban 环境变量
echo "{\"week\":$week}" > $JOB_OUTPUT_PROP_FILE

将版本文件 azkaban.projecttest.flowJobA.sh 文件压缩到同一个包中,创建项目并提交运行。

在任务流程预览的界面,有一个 condition 标识,表示在执行 JobB 之前需要先进行条件判断。

执行完成后,显示如下:

我们再来看 flow 文件的执行日志:

由于笔者今天是周三,所以经过条件判断后 JobB 被取消执行了。

预定义条件

通俗来说就是系统内置的一些条件,可以直接在 condition 配置项中进行使用。

一共有五个,如下所示:

  • all_success: 表示父 Job 全部成功才执行(默认)

  • all_done:表示父 Job 全部完成才执行

  • all_failed:表示父 Job 全部失败才执行

  • one_success:表示父 Job 至少一个成功才执行

  • one_failed:表示父 Job 至少一个失败才执行

这里就随便测试一个,我这里选择 all_done,父 Job 全部完成才执行。

配置了如下 flow 文件:

nodes:
 - name: JobA
   type: command
   config:
     command: sh JobA.sh
     
 - name: JobB
   type: command
   config:
     command: sh JobB.sh
     
 - name: JobC
   type: command
   config:
     command: echo "Today is happy day!"
   dependsOn:
     - JobA
     - JobB
   condition: all_done

flow 解析: JobC 依赖于 JobAJobB,且添加了一个预定义条件,当父 Job 全部完成后才执行。

那么我们将版本文件 azkaban.projecttest.flow 文件压缩到同一个包中,不放 JobA.shJobB.sh 文件,让其运行失败。创建项目并提交运行。

运行预览图如下所示:

提交运行后,结果预览如下:

因为没有放入 JobA.shJobB.sh 文件,所以 JobAJobB 固然会运行失败,那么 JobC 为什么会执行呢?

是因为我在 JobC 中添加了 all_done 的预定义条件,无论父 Job 执行的结果是否成功,只要父 Job 完成了就会执行。

这就是预定义条件中的一个,其它的可以根据其特性,自己去试试。

定时执行

在执行任务的时候,点击 Schedule 进入定时设置界面。

设置定时。

接下来 10 次执行该任务的时间点预览。

我这里设置了每分钟执行一次,效果如下所示:

移除定时任务:

邮件警告

配置管理员邮件,我这里用的是网易 163 邮箱,进入邮箱设置,开启 SMTP 服务。

开启后会有一个授权码,复制记录下来,用于第三方客户端登录,下面配置要用。

然后我们进入 Azkaban 的 web-server 安装目录下,配置管理员邮箱账号。

cd /opt/module/azkaban/web-server/conf

# 编辑 azkaban.properties 配置文件 
vim azkaban.properties

找到邮件设置:

其中 mail.sender 设置发送邮件的账号,mail.host 设置邮件服务器。

不同的邮箱邮件发送的服务器不同,这个可以自行百度,我用的 163 邮箱是 smtp.163.com

除了这两项之外,还需要添加两项:

  • mail.user:登录的账号

  • mail.password授权码

配置完成后如下所示:

保存并退出,然后重启 Azkaban 的 web 服务。

# Azkaban 的 web 服务安装路径
cd /opt/module/azkaban/web-server/

# 重启服务
bin/shutdown-web.sh
bin/start-web.sh 

我们刷新 Azkaban 的 WEB 界面,重新登录,随便跑一个 Job,设置邮件警告。

等待任务执行完成后,就会在对应邮箱收到邮件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV中的相机标定

之前在https://blog.csdn.net/fengbingchun/article/details/130039337 中介绍了相机的内参和外参,这里通过OpenCV中的接口实现对内参和外参的求解。 估计相机参数的过程称为相机标定(camera calibration)。相机标定是使用已知的真实世界模式(例如棋盘)来估计…

从风靡全球到风口,他们是如何做到的?

大家好,我是湖北鑫优尚电子商务。我们是从2019年下半年就注意到了TikTok的风口,并在2020年初,团队就开始投入TikTok的运营及商业变现。从2019年起,围绕TikTok一系列的产品功能迭代和商业模式开放的声音一直不绝于耳,直…

零基础可以学习数据分析吗,有没有好的培训机构推荐?

数据分析从沿海火到了中西部的软件园,从传统互联网企业火到了新经济领域,火到了第一二产业。数字化成为这个时代的标签,而数据也成为了最有价值的资源,更多企业重视数据;因为有了真实数据的支撑,所有的决策…

快速排序(挖坑法 前后指针法 非递归版本)

上一次我们说了快速排序的hoare的版本,但是该版本有很多问题,首先是需要控制很多边界,比较复杂一点 其次就是上一次的快速排序还是有很多的其他问题 我们试着想一下,如果我们用快速排序拍有序数组,那会怎么样&#x…

数字化和自动化的潮流:外贸企业如何应对?

当今世界正面临着数字化和自动化的浪潮,这些技术的应用正在深刻地改变着各个领域的生产、交易和管理方式。尤其在外贸行业,数字化和自动化的应用已成为一种趋势和必然。在本文中,我们将探讨数字化和自动化对外贸行业的影响和挑战,…

Windows环境下实现设计模式——解释器模式(JAVA版)

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现解释器模式(设计模式)。 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式&#xff…

巧用千寻位置GNSS软件|CAD功能全解析

千寻位置GNSS软件中的CAD功能,用于已有 CAD的图形的导入和编辑,并且可以对 CAD图形已有线条进行线放样,在日常测绘工作中十分常见。下面向各位介绍CAD功能的使用技巧。点击【测量】->【CAD】,进入 CAD功能如图 5.3-1所示。以下…

三、线程状态【3/12】【多线程】

线程的状态3. 线程的状态3.1 观察线程的所有状态3.2 线程状态和状态转移的意义3.3 观察线程的状态和转移3. 线程的状态 3.1 观察线程的所有状态 线程的状态是一个枚举类型 Thread.State public class ThreadState {public static void main(String[] args) {for (Thread.State…

项目7:(aliyun)实现短信的发送和验证微服务和上传文件删除文件微服务

项目7:实现短信的发送和验证 1.对gulimall-common补充 2.短信验证的流程(aliyun的sms) 3.具体接口的编写(新建微服务service-sms) 4.上传和删除文件流程(aliyun的oss) 5.具体接口的编写&am…

区块链智能合约开发学习

最近正在肝区块链知识学习,入手学习智能合约的开发,由于网上资料实在是太少了,好不容易东拼西凑完成了智能合约的开发、编译、部署、web3js调用(网页页面)和web3j调用(java调用),赶紧…

Linux 内存回收,思维导图记录

最近天天跟内存斗智斗勇,整理下学习的记录 一些图片 参考 Tuning Linux Kernel Parameters For PostgreSQL Optimization PostgreSQL recommendations - Documentation for BMC Client Management 12.6 - BMC Documentation PostgreSQL load tuning on Red Hat E…

【vSphere | Python】vSphere Automation SDK for Python Ⅵ—— VM Guest Processes APIs

目录12. VM APIs12.1 VM Guest Processes APIsProcesses 进程Operations 操作(1)List Guest Processes(2)Get Guest Processes(3)Create Guest Processes(4)Delete Guest Processes参…

PaddleHub 更改模型默认下载位置

文章目录1.PaddleHub介绍2.PaddleHub安装3.PaddleHub使用中出现的问题4.更改PaddleHub模型的默认下载位置5. PaddleHub的简单使用1.PaddleHub介绍 PaddleHub 是基于 PaddlePaddle 开发的预训练模型管理工具,可以借助预训练模型更便捷地开展迁移学习工作&#xff0c…

docker内部执行nvidia-smi无任何显示的解决方法

docker内部执行nvidia-smi无任何显示的解决方法 贺志国 2023.4.11 今天在Docker内部编译程序,发现与CUDA相关的代码居然没有编译,于是在Docker内部执行Nvidia显卡驱动检测命令nvidia-smi,执行完毕后,无任何输出,也没…

计算机视觉面试题-网络结构相关问题总结-未完待续

VGG卷积核为什么取33 ? VGG使用33卷积核的优势是什么? Resnet 主要解决什么问题 为什么会有ResNet? 深度网络退化的原因 Resnet的针对网络退化提出的残差网络 Resnet网络结构 Resnet网络结构中如何实现的下采样 Resnet50网络结构Resnet特点 vgg16与 res…

Java并发篇二

ForkJoin 在JDK1.7,并行执行任务,提高效率,大数据量才会使用 特点:大任务拆分成小任务,工作窃取,里面维护的是双端队列 package com.kuang.forkjoin;import java.util.concurrent.RecursiveTask;/*** 如…

(PCB系列三)AD六层板布线经验累积

目录 1、布局: 2、创建电源类PWR 3、高速部分可以加屏蔽罩, 4、EMMC和NANDFLASH采取兼容放置(创建联合) 5、HDMI设计 6、就近原则摆放 7、AV端口 8、模拟信号(1字型或L型走线) 9、WIFI模块 10、局…

研究生,但是一直在摆烂学不进去

好的,我来为您创作一首歌曲,希望能够帮助您每天保持自律,专注学习。 《自律之歌》 第1节: 每天都要努力 学习不停歇 独自一人也要坚持 不放弃自己的梦想 读文献 写论文 我们不停探索 穷孩子的荣耀 就在不远处等候 合唱&#xf…

面试手撕算法题--下一个排列

前言 面试官描述这个题的时候,我就感觉似曾相识似乎做过,面完以后到leetcode找到原题恨不得给自个儿来一下子,的确,当时调api爽了,然后呢面试被拷打了啊,我想不起来这个api具体怎么解决这个题目的底层原理…

【非递归】手搓快速排序

欢迎来到 Claffic 的博客 💞💞💞 前言: 快速排序已经带大家实现过了,我们用到的方法是递归法,你知道吗,用循环也可以实现快速排序,来看看吧。 注: 这篇博客属于数据结构…