Sqoop增量导入导出总结

  • Sqoop做为关系型数据库RDBMS和大数据平台(HDFS,Hive,Hbase等)导入导出工具,如果不熟悉其参数作用,使用起来各种问题,本文作为博主对Sqoop的实践作出一定的总结,如有错误,仅供参考。

Sqoop Job

  • Sqoop job 的是给使用者提供一个封装sqoop job的功能,其作用是可以自动更新job 的meta信息,让增量导入时指定的last-value自动被更新记录,不用额外的使用其他手段记录信息。

  • Sqoop job操作:

      创建job
      sqoop job --create <job-id> -- [import|export] 
      #注意,创建导入导出job ,最后一个'--'后面要加一个空格
      查看job
      sqoop job --show <job-id>
      #查看job的详细信息
      查看job列表
      sqoop job --list
      删除job
      sqoop job --delete <job-id>
      执行job
      sqoop job --exec <job-id>
    
  • Sqoop ‘- -password /- -password-file’ 参数

      sqoop支持俩种密码的输入,一种直接传递(--password),一种使用文件(--password-file),直接在shell 上填写密码,sqoop会提示不要在命令行直接使用密码。
      创建sqoop job时,如果直接在命令行使用密码(--password),是无效的,当你执行job时,依然会让你重新输入密码。
    
  • 不输入密码的俩种方式:

      1.修改sqoop-site.xml
       <property>
          <name>sqoop.metastore.client.record.password</name>
          <value>true</value>
          <description>If true, allow saved passwords in the metastore.
          </description>
        </property>
        此种方式在第一次输入密码后,以后再执行就不需要输入密码
       
      2.使用--password-file 指定密码文件,文件可以是本地文件系统,也可以是HDFS文件
      echo -n 'password' > filename.password
      -n 参数表示不换行输出,当你的密码文件格式不正确时,执行job时会报错
      java.sql.SQLException: Access denied for user 'xxx'@'xxxx' (using password: YES)
    

增量导入

  • 限于篇幅,sqoop全量导入导出,这里就不再介绍

  • sqoop使用–incremental参数实现增量导入,有俩种模式:append和lastmodified

  • Append模式

      必须参数:
      		--check-column <column-name> #检查列,sqoop根据指定列来查询出大于last-value值的数据,实现增量导入,可以为自增的列,如id,也可以是自增的时间类型
      		--incremental append #指定append模式
      		--last-value <init-value>
      		此种模式,大于last-value的值会被追加到目标数据中,如果指定的是时间类型,那么之前数据被修改后,时间变动导致的增量会被追加,因此会有数据重复,一般指定自增的id。
      eg:
      sqoop job --create job-id \
      -- import \
      --connect jdbc-url \
      --username username \
      --password-file password-file-path \
      --table table-name \
      --num-mappers 2 \
      --split-by id \
      --hive-import \
      --hive-database db \
      --hive-table table-name \
      --check-column id \
      --incremental append \
      --last-value 0 \
    

    APPEND 模式支持导入到HDFS和Hive

  • Lastmodified模式

  • lastmodified需要指定一个更新的时间列,会将大于指定时间列的值增量导入到目标数据源,被更新的数据行也会被导入,导入方式又分为append和merge-key俩种模式,需要注意的是,此种增量导入方式不支持直接导入到Hive

      必须参数:
      	--target-dir hdfs-path # HDFS路径
      	--check-column <column-name> #检查列,sqoop根据指定列来查询出大于last-value值的数据,实现增量导入,一般为日期时间类型
      	--incremental  lastmodified #指定lastmodified模式
      	--last-value <init-value>
      	--append 或--merge-key <column> 
      eg:
      sqoop job --create job-id \
      -- import \
      --connect jdbc-url \
      --username username \
      --password-file password-file \
      --table table \
      --columns columns \
      --num-mappers 1 \
      --target-dir target-dir \
      --fields-terminated-by '\t' \
      --check-column check-column \
      --incremental lastmodified \
      --last-value "1970-01-01 08:00:00" \
      --merge-key id
    

指定append时,更新和新增的数据会被追加到目标数据,指定merge-key时,更新的数据会和之前数据按照指定的key合并生成最新的数据,新增的数据会被追加,指定的key一般为主键,需要注意的是,如果target-dir 目录存在,那么该sqoop job会重新启动一个MapReduce作业按照merge-key更新之前的数据生成新的数据集,新生成的文件数量不受num-mappers参数影响

增量导出

  • Sqoop 增量导出基于hdfs数据,使用–export-dir指定,实现增量导出的关键是–export-dir 指定路径的数据是否是增量的,可以使用以下方式:

      INSERT OVERWRITE TABLE/DIRECTORY 'table_name/directory_anme' SELECT...
    
  • 增量导出也有俩种模式,allowinsert和updateonly,使用–update-mode 参数进行指定,allowinsert模式是对已存在的数据进行更新,新增的数据进行追加,前提是目标表存在主键,updateonly模式(默认)仅允许对存在的数据进行更新,更新指定的key,用–update-key参数指定

      必要参数:
      	--update-key <key>
      	--update-mode <allowinsert/updateonly>
      
      eg:
      sqoop export 
      --connect jdbc-url \
      --username username \
      --password password \
      --table <targetTable> \
      --fields-terminated-by ‘,’ \
      --update-key key \
      --update-mode  allowinsert \
      --export-dir export-dir
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章