惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Vercel News
Vercel News
F
Fortinet All Blogs
月光博客
月光博客
G
Google Developers Blog
博客园 - Franky
GbyAI
GbyAI
The Cloudflare Blog
I
InfoQ
雷峰网
雷峰网
WordPress大学
WordPress大学
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
T
The Blog of Author Tim Ferriss
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
小众软件
小众软件
腾讯CDC
B
Blog
量子位
V
V2EX
S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News

热爱生活与梦想

迁移LeanCloud的Waline评论数据到TiDB/Neon 25年江浙地区暑假自驾游之感慨 使用阿里云灵码继续完成构建 SSL 证书管理器 亲手给儿子做的棒棒糖摩天轮六一礼物 使用腾讯云 CodeBuddy 构建 SSL 证书管理器 修复代码块默认高度相关缺陷 HugoNexT4.7.2 新功能和升级提示 改善代码块折叠和选中功能 支持Github风格的警告样式 新增音乐短代码功能支持 给文章添加摘要和过期提示功能 回顾24年的过去总结 修复Mathjax行内显示公式的问题 给Hugo文章增加阅读更多跳转的锚点定位功能 Win10隐匿的VPN设置和L2TP连接常见错误 Go语言中“糟糕”的日期时间格式化设计 DaoCloud道客提供的免费Docker镜像代理服务 感谢万能淘宝让自己吃到喜欢的美食 WSL运行时遇到未知异常错误无法使用 隐藏的换行符导致Base64加密解密失败 MySQL自带客户端直接免密登录操作 Linux系统中删除目录软链接的注意项 Java程序调用外网API时CA问题 如何不关机重启WSL2恢复虚拟服务 在Windows上安装Podman容器平台做虚拟化 记一次无法弹出移动硬盘的记录 为友情链接添加自动检测脚本 重新激活Github的2FA认证 Linux中使用tar压缩命令排除文件 继续小米手环的健康生活之旅
Azkaban所支持的Job类型及示例
凡梦星尘 · 2017-09-10 · via 热爱生活与梦想

在官方文档的介绍中,了解到Azkaban所支持的工作类型还是很丰富的,如:CommandHadoopShellPythonJavaHivePig等等。不过在此我们主要具体只来讲解下PythonJava的工作类型任务,其它工作类型的话,比如CommnadHiveHadoopShell相对比较简单就不做详解,有需要的话可以自行实践一下。

不管提交哪一种任务,Azkaban默认都是通过上传压缩包来管理,那么在此建议大家养成一个习惯,不要所执行的文件(代码)打包到Azkaban的工程包里面。这样带来的好处是显而易见的,比如:

  • 工程创建的速度快,不需要上传执行部分文件

  • 避免了修改MySQL中的max_allow_packet参数以解决工程文件上传失败的问题

  • 在分布式布署环境中,当执行Task免去了在不同节点中拷贝工程包的麻烦

Java工作任务

由于工作业务场景中,大部分的代码都是Java来编写的,这也正是选择Azkaban的重要原因。与常见的Java程序并无太大的差异,唯一的不同便是程序入口的方法不一样。需要在入口的类中增加个**run**方法,即这方法是启动整体个Task的关键。示例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package io.github.elkan1788.azkabantasks;

import azkaban.utils.Props;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Azkaban java job example
 * @author elkan1788@gmail.com
 */
public class JobMain {

    private static final Logger logger = LoggerFactory.getLogger(JobMain.class);

    private int fileRows;
    private int fileLine;


    /**
     * Dynamic parameters set
     */
    public JobMain(String name, Props props) {
        this.fileRows = props.getInt("file.rows");
        this.fileLine = props.getInt("file.line");
    }

    public void run() throws Exception {
        logger.info(" ### this is JavaMain method ###");
        logger.info("fileRows value is ==> " + fileRows);
        logger.info("fileLine value is ==> " + fileLine);
    }

}

在上面的示例代码中,增加了动态参数设置,最后在打包的时候并不需要指定MainClass的所在,只要项目中的所有相关的代码及依赖打包到一个独立的文件即可。

另外我们还需要构建一个Azkaban工程脚本来告诉它如何执行我们的任务,脚本示例如下:

1
2
3
4
5
6
7
8
type=java
job.class=io.github.elkan1788.azkabantasks.JobMain
#指定执行jar包的路径
classpath=/home/azkaban/javademo/*
#用户参数1
file.rows=10
#用户参数2
file.line=50

为了不让任务太单调,顺便个简单的命令输出,组成个FLOW形式输出,参考脚本如下:

1
2
3
type=command
dependencies=java
command=whoami

效果如下:

Azkaban-Jobs02

Pthon工作任务

Python的工作任务相对就简单了,不过目前没找到动态入参的方法。执行Python工作任务的方法有两种, 参考代码如下:

  • command类型
1
2
type=command
command=python -u /home/azkaban/pythondemo/helloworld.py
  • python类型
1
2
3
type=python
python=python
script=/home/azkaban/pythondemo/helloworld.py

效果如下:

Azkaban-Jobs01

总结

总的来说,Azkaban编写任务的脚本还是简单且灵活的,不过也有比较坑人的地方。比如前面举粟的Java工作任务,在实际的运行过程中是需要添加hadoop的依赖包及相关配置,能过查阅官方文档得知是因为Java任务类型是在HadoopJava衍生出来的,所以也就难怪了。还好这也是只是配置环境时的问题,后续的应用开发还是挺方便的。