美文网首页
azkaban(四):Java进程

azkaban(四):Java进程

作者: 万事万物 | 来源:发表于2021-07-29 08:18 被阅读0次

    编写java程序

    1. 创建一个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!");
        }
    
    }
    
    1. 将项目达成jar包


      项目打包
    2. 重命名(非必要)
      jar包名称太长,重命名一下

    $ mv hive-function-1.0-SNAPSHOT.jar hive-function.jar
    

    准备

    1. 准备一个工程说明文件flow20.project;内容如下
    azkaban-flow-version: 2.0
    
    1. 准备一个 *.flow 文件,配置Java项目
    nodes:
      - name: javajob
        type: javaprocess
        config:
          java.class: com.admin.function.AzkabanFuncation
    

    name:job名称,随意
    type:需要执行java程序,所以需要指定类型为javaprocess
    job.class:配置main方法的类路径

    参考azkaban官网

    该java作业类型被广泛的应用在原有阿兹卡班的内置型。它不再是 Azkaban2 中的内置类型。将 javaprocess仍然是内置在Azkaban2。java和javaprocess作业类型之间的主要区别是:

    1. javaprocess运行具有“main”方法的用户程序,java 运行 Azkaban 提供的调用用户程序“run”方法的 main 方法。
    2. 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依旧是内置的。

    1. 打包
      将三个文件(hive-function.jar、java.flow、flow20.project)打成压缩包(‘java.zip’)
    java.zip
    

    运行

    1. 创建一个信息的工程
    创建工程
    1. 上传压缩包到该项目中
    上传文件
    1. 执行
    点击Execute Flow
    点击 Execute
    1. 运行情况
    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
    

    相关文章

      网友评论

          本文标题:azkaban(四):Java进程

          本文链接:https://www.haomeiwen.com/subject/mvjpmltx.html