date: 2020-05-31 12:09:00

updated: 2020-08-21 17:33:00

Sqoop源码解析

org.apache.sqoop 文件夹

参考文档:

  1. https://blog.csdn.net/omadesala/article/details/48368163

1. 启动

  • Sqoop 类下的 main() 方法: 如果没有参数,返回 "sqoop help' for usage." 并终止。如果有参数,调用 runTool(args, new Configuration())

    • runTool(args, new Configuration()): 主要任务是负责解析参数

      • 尝试调用 OptionsFileUtil 类下的 expandArguments(String[] args) 方法

        • expandedArgs = OptionsFileUtil.expandArguments(args); 遍历所有参数,如果有 “--options-file” 这个参数,就打开指定的脚本文件(保存要执行语句的参数和值),先过滤掉 # 开头的注释部分,然后判断 \ 结尾、' 、 " 开头,依次过滤掉这些情况,将最后的参数加入 options[] 中;否则就将参数直接添加到 options[] 中。最终返回结果为 (String[])options.toArray(new String[options.size()]) 。
    • expandArguments() 返回的结果保存在 expandedArgs[] 中,String toolName = expandedArgs[0] 第一个位置的参数就是 sqoop 语句要使用的功能(export,import等)
    • 通过 Configuration pluginConf = SqoopTool.loadPlugins(conf); 返回 sqoop 所有 tool 以及对应的配置信息。
    • 调用 SqoopTool 类下的 getTool(String toolName) 方法,会从 Map<String, Class<? extends SqoopTool>> TOOLS 这个里面来读取具体使用的 tool 的类信息,创建一个实例,返回一个 SqoopTool
    • 调用 runSqoop(sqoop, (String[])Arrays.copyOfRange(expandedArgs, 1, expandedArgs.length)); sqoop 是传入 tool 和 pluginConf 创建的一个 Sqoop 实例;将 tool 之后的所有参数传递出去。 eg: sqoop export --connect ... expandedArgs=["export","--connect",...] export 就是 tool
    • 调用 ToolRunner.run(sqoop.getConf(), sqoop, toolArgs); 方法执行。由于 Tool 是一个抽象类,run() 方法被 Sqoop 重写,所以最终调用的方法还是 Sqoop 类下的 run() 方法
      • 通过 Parser 类下的 parse(Options options, String[] arguments, Properties properties, boolean stopAtNonOption) 方法对一些普遍的option进行解析,比如 -fs <local|namenode:port> specify a namenode -jt <local|resourcemanager:port> specify a ResourceManager -D <property=value> use value for given property 等等
    • 调用 SqoopTool 类下的 parseArguments(String[] args, Configuration conf, SqoopOptions in, boolean useGenericOptions) 方法来解析参数。此时的 tool 指向的是具体的功能,import、export 等,调用的方法都在对应的类下: tool 包下有对应的所有的功能文件。在判断完参数是完整的情况下,最后执行的 run() 方法也是在对应功能文件下的 run() 方法。

      — 以 ExportTool 为例,在执行 run() 方法时,会回调父类 BaseSqoopTool 类下的 init(SqoopOptions sqoopOpts) 方法,来生成一个 ConnManager 实例,用来管理连接信息。通过 this.codeGenerator.generateORM(options, tableName); 来将表结构对应的 java 类写入 jar 文件,这个 jar 文件和其他 options 会构造出一个 ExportJobContext 对象,根据 --update_mode 参数来决定更新方式

      • 通过调用 orm 包下的 ClassWriter 类的 ClassWriter(SqoopOptions opts, ConnManager connMgr, String table, CompilationManager compMgr) 方法,和 generate() 方法来生成一个 .java 文件,路径保存在 orm 包下的 CompilationManager 类的对象中,再经过 compile() 和 jar() 方法来打包生成 表名.jar 文件。
      • 在 SqoopOptions 类下会保存目标表的所有字段,针对字段会做一个过滤,是否等于 java 保留关键字,如果等于就用在前面加一个 _。
    • 数据库的连接方法基类抽象类在 manager 包下的 ConnManager 文件里,主要包括 1.MainFrameManager——连接主机 2.SqlManager——连接各种支持JDBC连接的数据库

      Sqlmanager 类下在获取到参数后,会先尝试连接一下数据库,执行一个 select t.* from XX as t limit 1 的语句
    • mysql 和 hadoop 连接的时候使用的是 SqlManager 类,如果是 import 调用的是 importTable 方法,如果是 export 调用的是 exportTable 方法。根据生成的 ExportJobContext 上下文实例,执行 runExport() 方法,调用的是 mapreduce 包下的 ExportJobBase 类的方法。
    • 配置好 job 相关信息,执行 runJob(job) 方法。
      • 在 hive export to mysql 时,如果字段还有特殊字符,可能会出现因为切分数据而导致数据错位导致推数失败的情况。如果要对 hive 表中的数据进行处理的话,需要在 mapreduce 包下找到对应的 mapper 类(根据 hive 表类型划分为 TextExportMapper、ParquetMapper、SequenceFileMapper 等)
    • 具体解析参数是在 SqoopParser 类下的 processArgs(Option opt, ListIterator iter) 方法

sqoopTool:sqoop具体的工具类

Hive 用增量

采集、建模需要固定的时间段,昨天9点到今天9点,限制住时间,或者要先获取到上次执行时间,再算上这次的执行时间。建模无法获取上次的执行时间,如果固定时间间隔,如果报错后续处理,比如垮天了,或者白天执行作业的时候就会很麻烦。

Hive不支持删除数据,对于不要的数据只能全量执行,不管是采集还是建模。

如果业务那边有一个base_table,每天的一个增量表,可以做成拉链表。燃气设备是做成了拉链表,是在源头做的,不是在hive

kpi 是增量插入一天一条,但是如果存在回补历史数据或者修正历史数据,比如某一天的数据就很麻烦

Sqoop源码解析的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  4. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  5. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  6. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  7. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

  8. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

  9. jQuery2.x源码解析(回调篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...

随机推荐

  1. 使用vue-cli(vue脚手架)快速搭建项目-2

    接上一篇文章,这篇文章对如何使用IDEA打开并运行项目做教程 1.将在窗口模式启动的Vue关闭 只需要按住Ctrl+C,输入Y就可以了 2.打开idea 3.复制你项目所在地址,然后点击OK 4.下面 ...

  2. Java 中 static 的作用

    static 关键字的作用 在 Java 中 static 关键字有4种使用场景,下面分别进行介绍: 1.static 成员变量 public class Student { // 静态成员变量 pr ...

  3. C#开发PACS医学影像三维重建(一):使用VTK重建3D影像

    VTK简介: VTK是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的. 因为使用C#语言开发,而VTK是C++ ...

  4. javaweb开发中的常见错误

    Javaweb中的最常见错误及其解决方法 1.200:表示成功处理业务. 2.400 请求出错: 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就 无法重复此请求. 解决办法:,遇到400 ...

  5. 趣图:我说自己菜 vs 大佬说自己菜

      扩展阅读 一大波趣图:CSS的力量 趣图:嫁人就嫁程序员,大妈都懂的! 趣图:向客户介绍的产品VS实际开发的产品 如何准备校招技术面试+一只小菜鸟的面试之路 向Spring大佬低头--大量源码流出 ...

  6. 《Head First 设计模式》:代理模式

    正文 一.定义 代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问. 要点: 代理模式为一个对象创建了代理对象,让代理对象控制对该对象的访问.被代理的对象可以是远程的对象.创建开销大的对象 ...

  7. Solidity智能合约面向对象编程(一、类的创建)

    Solidity编写智能合约 1 pragma solidity ^0.4.4;//版本声明 ^代表向上兼容 pragma代表版本声明 solidity 代表开发语言 2 //定义类 3 contra ...

  8. Jquery的一键上传组件OCUpload及POI解析Excel文件

    第一步:将js文件引入页面 <script type="text/javascript" src="${pageContext.request.contextPat ...

  9. Go-The process cannot access the file because it is being used by another process.

    where? Go程序在读取文件时候 why? 因为有其他进程也在读取和Go程序想要读取的文件,参数冲突 way? 关闭其他程序进程对该文件的读取操作

  10. 开源发丝分割数据集CelebAHairMask-HQ(国庆献礼)

    在这个特别日子里,举国欢庆,什么都可以缺席,大礼包不行. 本次开源针对CelebAMask-HQ中发丝部分进行细化的数据集. 该数据集可用于发丝分割等方向的研究和探索. 在过去的一年时间里,疫情改变很 ...