Oozie源码分析 (一) : Oozie的客户端启动过程
Oozie(驭象者)是Yahoo开发的工作流引擎,主要用于管理Hadoop任务(支持MapReduce、Spark、Pig、Hive),把这些任务以DAG(有向无环图)方式串接起来。
1、 通过Shell命令启动Oozie作业
2、找到该shell命令执行对应的shell脚本—【一个名为oozie的可执行文件】
3、找到oozie文件的最后一行
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); } }
- 点赞
- 收藏
- 关注作者
评论(0)