Sqoop数据导入记录

sqoop导入数据原理  

sqoop从关系型数据库导入数据前,首先进行的操作是,通过java提供的jdbc api访问存储在RDBMS中的数据表。它检索出表中所有的列以及列的SQL数据类型。这些SQL类型如:VARCHAR、INTEGER等将被映射成为java数据类型:String、Integer等。在MapReduce应用程序中将使用这些对应的java类型来保存字段的值。Sqoop的代码生成器使用这些信息来创建对应表的类,用于保存从表中抽取的记录。

    对于数据导入来说,最为关键的是DBWritable接口的序列化方法,这些方法能使代码生成器生成的类跟JDBC交互。其中DBWritable接口中主要有这俩个方法:

    public void readFields(ResultSet _dbResults)  throws SQLException;

    public void write(PreparedStatement  _dbStmt)  throws   SQLException;

JDBC的ResultSet接口提供了一个用于从查询结果中检索记录的游标,这里的readFields()方法将用ResultSet 中一行数据的列来填充widget对象的字段。这里的write()方法允许Sqoop将新的数据行插入表,这个过程称为导出。

   Sqoop启动MapReduce作业会用到一个InputFormat类,它可以通过jdbc从一个数据库表中读取部分内容。Hadoop提供的DataDrivenDBInputFormat能够为几个map任务对查询结果进行划分。查询是根据一个划分列来进行划分的。根据表的元数据,Sqoop会选择一个合适的列作为划分列(如果主键存在,通常是表的主键)。主键列中的最大值和最小值会被读出,与目标任务数一起来确定每个map任务要执行的查询。在运行一个导入作业时,用户可以指定一个列作为划分列(使用 --split-参数),而不一定必须要使用主键。

    在生成反序列化代码和配置InputFormat类之后,Sqoop会将作业发送到MapReduce集群。map任务执行查询并将(ResultSet)查询返回的数据反序列化成生成类的实例,并将这些数据要么直接保存在SequenceFile文件中,要么写到HDFS之前被转换成分隔的文本。

Sqoop增量导入

    对于sqoop的增量导入来说分为俩种场景:

             (1) 数据库中的表只有新行增加,而不存在对现有行的更新。对于这种情况需要设定特定列(--check-column参数指定)的值大于指定值(--last-value设置)。这种模式称为append模式,它通过--incremental append来激活。

            (2)现在行也可能进行更新,对于这种情况的增量导入,只能是基于时间的增量导入(通过--inremental lastmodified激活),此时需要指定列(通过--check-column参数指定)以记录最近一次的更新时间。

    增量导入结束时,程序显示在下次导入时将被指定--last-value的值,这对于手工增量导入来说,非常重要。但,对于定期增量导入来说,最好使用Sqoop的 saved job 工具,它可以自动保存最近一次的值并在下次作业运行时使用。可以通过sqoop job --help来了解更多的saveed job用法。

 Sqoop直接模式导入简单介绍

    Sqoop的架构支持它可以在多种可用的导入方法中进行选择,大多数的数据库导入都使用的是基于DataDrivenDBInputFormat的方法。不过,有些数据库提供了能够快速抽取数据的特定工具,比如mysql的mysqldump能够以大于jdbc的吞吐率从表中读取数据。在Sqoop文档中将这种使用外部工具导入的方法称为直接模式。由于直接模式并不像jdbc那样通用,比如,mysql的直接模式不能处理大对象数据,类型为CLOB或BLOB的列,sqoop需要使用jdbc专用的API将这些导入到hdfs。所以在使用直接模式导入时,必须由用户明确地启动(通过--direct参数)

猜你喜欢

转载自blog.csdn.net/sujins5288/article/details/88061658
今日推荐