Oozie源码分析 (一) : Oozie的客户端启动过程

举报
那人好像一条狗~ 发表于 2020/06/24 10:46:48 2020/06/24
【摘要】 Oozie(驭象者)是Yahoo开发的工作流引擎,主要用于管理Hadoop任务(支持MapReduce、Spark、Pig、Hive),把这些任务以DAG(有向无环图)方式串接起来。

Oozie(驭象者)Yahoo开发的工作流引擎,主要用于管理Hadoop任务(支持MapReduce、Spark、Pig、Hive),把这些任务以DAG(有向无环图)方式串接起来。


1、    通过Shell命令启动Oozie作业

image.png

2、找到该shell命令执行对应的shell脚本—【一个名为oozie的可执行文件】

image.png

3、找到oozie文件的最后一行

image.png

4、执行shell脚本oozie的实质是启动了一个java进程,而程序的入口即为org.apache.oozie.cli.OozieCLI

public static void main(String[] args) {
    // if (!System.getProperties().contains(AuthOozieClient.USE_AUTH_TOKEN_CACHE_SYS_PROP)) {
    //     System.setProperty(AuthOozieClient.USE_AUTH_TOKEN_CACHE_SYS_PROP, "true");
   //  }
    System.exit(new OozieCLI().run(args));
 }

5、然后直接进入OozieCLT.run( )方法,最主要的是去调用processCommand()方法,processCommand方法会根据命令行传来的命令调用相应的方法,以hadoop的job为例,会调用jobCommand()方法。

public void processCommand(CLIParser parser, CLIParser.Command command) throws Exception {
     if (command.getName().equals(HELP_CMD)) {
         parser.showHelp(command.getCommandLine());
     } else if (command.getName().equals(JOB_CMD)) {
         jobCommand(command.getCommandLine());
     }     /*其他代码*/
 }

6、在jobCommand()方法中会创建OozieClient客户端,然后根据命令行中的命令选项针对Hadoop job执行相应的动作,在这里以run为例,其中最重要的就是下面这几行代码。

private void jobCommand(CommandLine commandLine) throws IOException, OozieCLIException {
     XOozieClient wc = createXOozieClient(commandLine);
     List<String> options = new ArrayList<String>();
     for (Option option : commandLine.getOptions()) {
         options.add(option.getOpt());
     }
     /*其他代码*/
     if (options.contains(RUN_OPTION)) {
         System.out.println(JOB_ID_PREFIX + wc.run(getConfiguration(wc, commandLine)));
     }
     /*其他代码*/
 }

7、  其中wc.run(getConfiguration(wc, commandLine)))是调用OozieClient类中的run方法来Submit和Start一个workflow job。在OozieClient.run()方法会去验证Https URL连接的合法性(比如传入的URL连接中是hostname还是IP地址,这里如果传入的是IP地址的话,HttpsURLConnection中的HostnameVerifier会去检验这个)。如果Https连接合法

public String run(Properties conf) throws OozieClientException {
     return (new JobSubmit(conf, true)).call();
 }
public T call() throws OozieClientException {
     try {
         URL url = createURL(protocolVersion, collection, resource, params);
         if (validateCommand(url.toString())) {
             if (getDebugMode() > 0) {
                 System.out.println(method + " " + url);
             }
             HttpURLConnection con = createRetryableConnection(url, method);
             if (con == null) {
                 throw new OozieClientException(OozieClientException.CONNECT_ERROR, new Exception());
             }
             return call(con);
         } else {
             System.out.println("Option not supported in target server. Supported only on Oozie-2.0 or greater."
                     + " Use 'oozie help' for details");
             throw new OozieClientException(OozieClientException.UNSUPPORTED_VERSION, new Exception());
         }
     } catch (IOException ex) {
         throw new OozieClientException(OozieClientException.IO_ERROR, ex);
     }
 }


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。