sqoop 抽取源码流程分析(一) 主流程分析以及各种插件
来源:互联网 发布:iphone预约软件 编辑:程序博客网 时间:2024/06/06 04:12
1. 工具类的继承关系
目前sqoop 提供的各种工具,比如 ImportTool, ExportTool, CodeGenTool 等工具类都是集成于 BaseSqoopTool 这个基础类
下面看看这个BaseSqoopTool 基础类的继承关系
public abstract class BaseSqoopTool extends com.cloudera.sqoop.tool.SqoopTool {......public abstract class SqoopTool extends org.apache.sqoop.tool.SqoopTool {......public abstract class SqoopTool {
2. sqoop 之 main 函数
2.1 sqoop 继承关系
public class Sqoop extends Configured implements Tool {......
其中的Tool 和 Configured 是hadoop 中的基础类,毕竟sqoop 之用hadoop 来做的具体实现。
2.2 主函数
public static void main(String [] args) { if (args.length == 0) { System.err.println("Try 'sqoop help' for usage."); System.exit(1); } int ret = runTool(args); System.exit(ret); }
2.3 runTool 的实现
runTool 更具传入的sqoop 参数,选择需要使用的工具类名称来构建相应的工具类
...... SqoopTool tool = SqoopTool.getTool(toolName);...... Sqoop sqoop = new Sqoop(tool, pluginConf); return runSqoop(sqoop, Arrays.copyOfRange(expandedArgs, 1, expandedArgs.length));
那么具体的运行就是在各个工具类的具体实现里面了。
具体的实现可以参考对importTool的具体分析了
2.4 隐藏的关系
public static int runSqoop(Sqoop sqoop, String [] args) { try { String [] toolArgs = sqoop.stashChildPrgmArgs(args); return ToolRunner.run(sqoop.getConf(), sqoop, toolArgs);......
虽然是在hadoop 里面实现的这个run 方法,不过可以通过下面的具体实现来看出,其实调用的还是sqoop的run方法
public static int run(Configuration conf, Tool tool, String[] args) throws Exception{ if(conf == null) { conf = new Configuration(); } GenericOptionsParser parser = new GenericOptionsParser(conf, args); //set the configuration back, so that Tool can configure itself tool.setConf(conf); //get the args w/o generic hadoop args String[] toolArgs = parser.getRemainingArgs(); return tool.run(toolArgs);
2.5 真正的入口点
public int run(String [] args) { if (options.getConf() == null) { // Configuration wasn't initialized until after the ToolRunner // got us to this point. ToolRunner gave Sqoop itself a Conf // though. options.setConf(getConf()); } try { options = tool.parseArguments(args, null, options, false); tool.appendArgs(this.childPrgmArgs); tool.validateOptions(options); } catch (Exception e) { // Couldn't parse arguments. // Log the stack trace for this exception LOG.debug(e.getMessage(), e); // Print exception message. System.err.println(e.getMessage()); return 1; // Exit on exception here. } return tool.run(options); }
2.5.1 参数解析
public SqoopOptions parseArguments(String [] args, Configuration conf, SqoopOptions in, boolean useGenericOptions) throws ParseException, SqoopOptions.InvalidOptionsException {...... // Parse tool-specific arguments. ToolOptions toolOptions = new ToolOptions(); configureOptions(toolOptions); CommandLineParser parser = new SqoopParser(); CommandLine cmdLine = parser.parse(toolOptions.merge(), toolArgs, true); applyOptions(cmdLine, out); this.extraArguments = cmdLine.getArgs();
可以看出真正的参数解析是在SqoopParser这个类中
那么继续看SqoopParser 的parse方法
public void processArgs(Option opt, ListIterator iter) throws ParseException { // Loop until an option is found. while (iter.hasNext()) { String str = (String) iter.next(); if (getOptions().hasOption(str) && str.startsWith("-")) { // found an Option, not an argument. iter.previous(); break; } // Otherwise, this is a value. try { // Note that we only strip matched quotes here. addValForProcessing.invoke(opt, stripMatchedQuotes(str)); } catch (IllegalAccessException iae) { throw new RuntimeException(iae); } catch (java.lang.reflect.InvocationTargetException ite) { // Any runtime exception thrown within addValForProcessing() // will be wrapped in an InvocationTargetException. iter.previous(); break; } catch (RuntimeException re) { iter.previous(); break; } } if (opt.getValues() == null && !opt.hasOptionalArg()) { throw new MissingArgumentException(opt); } }
0 0
- sqoop 抽取源码流程分析(一) 主流程分析以及各种插件
- sqoop 抽取源码流程分析( 三 ) 代码生成工具分析
- Sqoop源码分析(一) Eclipse调试Sqoop各种异常解决
- sqoop 抽取源码流程分析( 二 ) 导入工具代码结构分析
- Nginx源码分析 - 主流程篇 - Nginx的启动流程
- PhoneGap插件调用Java流程源码分析(一)
- IK分词源码分析连载(一)--主流程
- 主流插件框架分析
- Kubelet源码分析(一) 启动流程分析
- libeio源码分析 – 主流程
- libeio源码分析 – 主流程
- fastdfs源码分析2-storage主流程
- fastdfs源码分析3-tracker主流程
- zookeeper的选主流程(源码分析)
- APM源码分析之 主流程
- cocos2d-x源码分析::主流程(mainloop)分析
- 【OVS2.5.0源码分析】datapath之主流程分析
- WebRTC源码分析一:音频处理流程
- 依赖、关联、聚合和组合之间区别
- 工程师实战经验:Beacon与Wi-Fi定位技术的精度/成本/开发难度 EDN
- 第二周 项目2-程序的多文件组织
- 事实,落实到实际
- C语言之强化,弱化符号weak
- sqoop 抽取源码流程分析(一) 主流程分析以及各种插件
- VOPO对象介绍
- 07-查看系统的开机时间
- mybatis学习教程中级(十)mybatis和ehcache缓存框架整合(重点)
- C++Primer第五版 3.3.1节练习
- 泛型
- 在iOS中9和OSX10.11配置应用程序传输安全
- 文章标题
- java 中 byte转Int .