编写java程序
- 创建一个java项目,编写一个java程序
package com.admin.function;
/**
* @author admin
* @date 2021/7/23
*/
public class AzkabanFuncation {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
-
将项目达成jar包
项目打包 -
重命名(非必要)
jar包名称太长,重命名一下
$ mv hive-function-1.0-SNAPSHOT.jar hive-function.jar
准备
- 准备一个工程说明文件
flow20.project
;内容如下
azkaban-flow-version: 2.0
- 准备一个
*.flow
文件,配置Java项目
nodes:
- name: javajob
type: javaprocess
config:
java.class: com.admin.function.AzkabanFuncation
name
:job名称,随意
type:需要执行java程序,所以需要指定类型为javaprocess
job.class
:配置main方法
的类路径
该java作业类型被广泛的应用在原有阿兹卡班的内置型。它不再是 Azkaban2 中的内置类型。将 javaprocess仍然是内置在Azkaban2。java和javaprocess作业类型之间的主要区别是:
- javaprocess运行具有“main”方法的用户程序,java 运行 Azkaban 提供的调用用户程序“run”方法的 main 方法。
- Azkaban 可以进行设置,例如获取 Kerberos 票证或在提供的主要java类型中请求 Hadoop 令牌,而javaprocess用户负责一切。
因此,大多数用户使用javatype 来运行任何与 Hadoop 集群通信的东西。hadoopJava现在应该用type代替这种用法 ,这是安全的。但是java 为了向后兼容,我们仍然在插件中输入类型
The java job type was widely used in the original Azkaban as a built-in type.
It is no longer a built-in type in Azkaban2.
The javaprocess is still built-in in Azkaban2. The main difference between java and javaprocess job types are:
1. javaprocess runs user program that has a “main” method,
java runs Azkaban provided main method which invokes user program “run” method.
2. Azkaban can do the setup, such as getting Kerberos ticket or requesting Hadoop tokens in the provided main in java type,
whereas in javaprocess user is responsible for everything.
翻译过来的意思就是:
java
在之前azkaban的版本中,是azkaban
内置的,在2.0
版本后就不再是内置的了,而javaprocess
依旧是内置的。
- 打包
将三个文件(hive-function.jar、java.flow、flow20.project)打成压缩包(‘java.zip’)
java.zip
运行
- 创建一个信息的工程
创建工程
- 上传压缩包到该项目中
上传文件
- 执行
点击Execute Flow
点击 Execute
- 运行情况
job列表
运行日志
重点
- 所有Job的配置,可以在web UI界面直接改。
job配置
编辑
这样可能有点抽象,不太好理解,修改java程序代码,接收外部传入参数。
public static void main(String[] args) {
// 接收 外部传入的参数
String name = null;
if(args.length>0){
name = args[0];
}
System.out.println(String.format("Hello %s",name));
}
重新 打成jar包->达成zip包->上传->
....
23-07-2021 18:33:35 CST javajob INFO - Hello null
23-07-2021 18:33:35 CST javajob INFO - Process with id 14129 completed successfully in 0 seconds.
23-07-2021 18:33:35 CST javajob INFO - output properties file=/opt/module/azkaban-exec/executions/6/javajob_output_5359270983053112115_tmp
23-07-2021 18:33:35 CST javajob INFO - Finishing job javajob at 1627036415203 with status SUCCEEDED
执行结果
23-07-2021 18:33:35 CST javajob INFO - Hello null
很显然这并不是我们想要的结果;如何进行传参呢?
动态参数
在 azkaban中,可以在命令后面使用占位符
的方式。
语法:${参数名称}
带双引号,只是表示传入参数是一个字符串
点击Add Row
新增一列,然后对占位符
进行赋值
绑定参数
点击Edit
即可查看到该页面。
运行结果
...
23-07-2021 18:46:51 CST javajob INFO - Hello 王二麻子
23-07-2021 18:46:51 CST javajob INFO - Process with id 10688 completed successfully in 0 seconds.
23-07-2021 18:46:51 CST javajob INFO - output properties file=/opt/module/azkaban-exec/executions/8/javajob_output_5599420541064984868_tmp
23-07-2021 18:46:51 CST javajob INFO - Finishing job javajob at 1627037211692 with status SUCCEEDED
当然也可以多个占位符。
注意的是,一旦设置了占位符,若不想绑定参数,可以不给占位符设置,但是不能不进行绑定
如:不给${name}
赋值
正确做法:
正确做法
运行结果:
...
23-07-2021 18:57:30 CST javajob INFO - Hello null
23-07-2021 18:57:30 CST javajob INFO - Process with id 10835 completed successfully in 0 seconds.
23-07-2021 18:57:30 CST javajob INFO - output properties file=/opt/module/azkaban-exec/executions/9/javajob_output_64425690725064180_tmp
23-07-2021 18:57:30 CST javajob INFO - Finishing job javajob at 1627037850637 with status SUCCEEDED
错误做法:
错误做法
运行结果:
报错
运行日志:
azkaban.jobtype.JobTypeManagerException: Failed to build job executor for job javajob
at azkaban.jobtype.JobTypeManager.buildJobExecutor(JobTypeManager.java:368)
at azkaban.execapp.JobRunner.prepareJob(JobRunner.java:722)
at azkaban.execapp.JobRunner.doRun(JobRunner.java:596)
at azkaban.execapp.JobRunner.run(JobRunner.java:563)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: azkaban.utils.UndefinedPropertyException: Could not find variable substitution for variable(s) [java.class->name]
at azkaban.utils.PropsUtils.resolveVariableReplacement(PropsUtils.java:304)
at azkaban.utils.PropsUtils.resolveProps(PropsUtils.java:233)
at azkaban.jobtype.JobTypeManager.buildJobExecutor(JobTypeManager.java:340)
... 8 more
23-07-2021 18:58:54 CST javajob ERROR - Job run failed preparing the job.
23-07-2021 18:58:54 CST javajob INFO - Finishing job javajob at 1627037934584 with status FAILED
网友评论