数据迁移工具Sqoop

Sqoop是什么?    
    sqoop是一个用来将hadoop和rdbms(mysql、oracle、postgres)的数据进行相互迁移的工具;他可以将rdbms的数据导入到hadoop的hdfs中,也可以将hdfs的数据导出到rdbms中。
Sqoop原理?    
    Sqoop中一大亮点就是可以通过hadoop的mapreduce把数据从rdbms中导入数据到hdfs/把数据从hdfs中导出到rdbms中。sqoop架构非常简单,其整合了Hive、Hbase和Oozie,通过
mapreduce任务来传输数据,从而提供并发特性和容错。sqoop主要通过JDBC和关系数据库进行交互。理论上支持JDBC的database都可以使用sqoop和hdfs进行数据交互。    
    但是,只有一小部分经过sqoop官方测试,如下:    
    Database            version             --direct support              connect string matches    
    HSQLDB             1.8.0+              No                            jdbc:hsqldb:*//    
    MySQL                5.0+                Yes                           jdbc:mysql://    
    Oracle                 10.2.0+            No                            jdbc:oracle:*//    
    PostgreSQL         8.3+                Yes                           (import only) jdbc:postgresql://
    较老的版本有可能也被支持,但未经过测试。出于性能考虑,sqoop提供不同于JDBC的快速存取数据的机制,可以通过--direct使用。
Sqoop工作流程
1.读取要导入数据的表结构,生成运行类,默认是QueryResult,打成jar包,然后提交给Hadoop
2.设置好job,主要也就是设置好的各个参数
3.这里就由Hadoop来执行MapReduce来执行Import命令了,
      1)首先要对数据进行切分,也就是DataSplit
          DataDrivenDBInputFormat.getSplits(JobContext job)
      2)切分好范围后,写入范围,以便读取
       DataDrivenDBInputFormat.write(DataOutput output) 这里是lowerBoundQuery and  upperBoundQuery
       3)读取以上2)写入的范围
          DataDrivenDBInputFormat.readFields(DataInput input)
4)然后创建RecordReader从数据库中读取数据
DataDrivenDBInputFormat.createRecordReader(InputSplit split,TaskAttemptContext context)
5)创建Map
TextImportMapper.setup(Context context)
6)RecordReader一行一行从关系型数据库中读取数据,设置好Map的Key和Value,交给Map
DBRecordReader.nextKeyValue()
7)运行map
TextImportMapper.map(LongWritable key, SqoopRecord val, Context context)
最后生成的Key是行数据,由QueryResult生成,Value是NullWritable.get()

原文地址:https://www.cnblogs.com/mengyao/p/4574964.html