Oozie源码分析 (一) : Oozie的客户端启动过程
【摘要】 Oozie(驭象者)是Yahoo开发的工作流引擎,主要用于管理Hadoop任务(支持MapReduce、Spark、Pig、Hive),把这些任务以DAG(有向无环图)方式串接起来。
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);
}
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)