首页 > 大数据 > > SQOOP 源码浅析
在数据处理的生态群里sqoop组件,占据了举足轻重地位。特别是将Hadoop和关系型数据库中的数据相互转移的sqoop是不二之选的工具。Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。
由于目前Sqoop1.4.6-CDH版本,把关系数据库mysql数据迁移到hive中,是不支持多级分区的。于是开启了两天魔改源码的节奏 - -
源码地址:
https://github.com/apache/sqoop
sqoop项目活跃度从客观上看还是比较活跃的。毕竟属于Apache开源顶级项目。

OK开启我的源码之路:
先整到本地idea,默认是maven

找到生成hive核心类TableDefWriter.java
sqoop传递参数如下所示都是存储在SqoopOptions中

分区信息如下:


生成创建hive表分区字符串拼接如下:


做了如下改造:
生成创建hive表分区字符串拼接如下:

分区信息如下:


org.apache.sqoop.tool.ImportTool是sqoop实现数据库导入功能的工具类。
protected ConnManager manager;
private CodeGenTool codeGenerator;ImportTool的run方法

org.apache.sqoop.manager.ConnManager是SqoopTool导入导出数据的核心类。它有3个子类:
SqlManager查询数据库主要有两种方式:本地模式和分布式模式
本地模式即直接在当前JVM中查询,比如查询表的结构。
分布式模式下进行数据导入导出的查询,如表的导入导出。importTable()方法是一个典型的例子。

根据命令行参数的选项,数据将被导入HBase、Accumulo或者HDFS。
在DataDrivenImportJob的runImport方法中,可以看到MapReduce Job的构造和提交过程。
Job的InputFormat的默认类型是DataDrivenDBInputFormat。OutputFormat默认为null,使用hadoop默认的FileOutputFormat。MapperClass根据输出文件格式的不同而不同。可能的文件格式有纯文本、avro、parquet等。
HBaseImportJob、AccumuloImportJob是DataDrivenImportJob的子类。为了将数据导入HBase 和Accumulo,它们实现了不同的MapperClass和OutputFormat。
HiveConfig:hive配置实例类
HiveImport:连接Hive工具类
HiveTypes:Hive类型映射类
TableDefWriter:hive定义语法,生成语法核心类

HiveConfig:
获取HiveConfig配置API:getHiveConf。传入Configuration实例,利用Java反射机制反创建实例HiveConfClass。其中通过构造器newInstance一个Configuration实例。
设置HiveConfig配置API:addHiveConfigs。传入Configuration作为hiveConf实例+Configuration作为返回设置后实例conf。通过Map遍历hiveConf,通过conf.set重置conf配置。并返回Configuration的conf。

HiveImport:
导入表进hive的工具类,管理自身连接hive,同时协调使用此类的其它package的类。
构造器,入参SqoopOptions(Sqoop收集命令参数),ConnManager(连接器),Configuration(配置hive conf),generateOnly(?没太搞懂这个变量含义以及作用是个boolean类型)

importTable,核心API:入参inputTableName(导入hdfs文件名称);outputTableName(导入hive的表名称);createOnly(是否只创建表)

sqoop导入hive,实质是导入hdfs。因为hive的底层存储是hdfs,sqoop也是分了两步做了导入hive:


HiveTypes:映射转换

isHiveTypeImprovised:如果SQL类型无法精确匹配转换为hive中type,我们必须把它转换成更通用类型

TableDefWriter:创建新的TableDefWriter以生成配置单元CREATE TABLE语句。

TableDefWriter分为两步走:
第一步:根据sqoop传递的参数,拿到指定schema和其它相关信息生成创建表的语句。
第二步:创建好指定表之后,开始把数据load进hive。
第一步API:getCreateTableStmt,生成创建hive表的语句,这个其实就是重点要修改的源码部分。
最终生成一个完成hive创建语句




第二步API:getLoadDataStmt,LOAD DATA statement to import the data in HDFS into hive。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3158266/ ,如需转载,请注明出处,否则将追究法律责任。