sqoop

一. sqoop的使用

  1. 常见命令

   help:查看命令

   list-databases:查看当前连接的数据库中的数据库列表(只能列出当前的用户有权限访问的数据库)

   import:导入,将关系库中的数据库表导入到hdfs上

   export:导出,将hdfs上的数据文件导出到关系库中

   job:可以创建一个执行任务

  列出mysql数据库中的可以访问的所有数据库

   sqoop list-databases --connect jdbc:mysql://192.168.1.101:3306 --username root --password 123456

  2. import命令

   --help:查看所有import下面的子命令

   --connect:设置数据库连接的字符串

   --username:设置数据库连接的用户名

   --password:设置数据库连接的密码

   --table:设置导入的数据库表的名称(如果导入的是Oracle数据库则表名必须大写)

   --target-dir:设置数据导入到hdfs上以后文件所在的位置(如果文件存在则会报错,除非设置delete-target)

   --delete-target-dir:如果导入的时候文件夹已经存在则会删除文件夹

   --num--mapper:设置开启的MR的数量

   --fields-treminated-by:设置列之间的分隔符

   --driver:设置驱动表的名称

   全量导入数据

    将mysql中数据库中test_t表导入到hdfs上

     sqoop import \

     --connect jdbc:mysql://192.168.1.101:3306/test \

     --username root \

     --password 123456 \

     --table test_t \

     --target-dir /test/demo \

     --delete-target-dir \

     --num-mappers 1 \

     --fields-terminated-by ',' \

     --driver com.mysql.jdbc.Driver

     --将Oracle中的数据库表emp导入到hdfs平台上

 

     sqoop import \
     --connect jdbc:oracle:thin:@192.168.1.101:1521:orcl \
     --username scott \
     --password 123456 \
     --table EMP \
     --target-dir /test/emp \
     --delete-target-dir \
     --num-mappers 1 \
     --fields-terminated-by ','

 

     --导入指定的列 使用命令:--columns 列名,列名,....
     sqoop import \
     --connect jdbc:oracle:thin:@192.168.1.101:1521:orcl1 \
     --username scott \
     --password 123456 \
     --table EMP \
     --columns ename,job,sal,deptno \
     --target-dir /test/emp \
     --delete-target-dir \
     --num-mappers 1 \
     --fields-terminated-by ','

 

     --按照条件进行过滤导入数据 --where 过滤条件

     sqoop import \
     --connect jdbc:oracle:thin:@192.168.1.101:1521:orcl1 \
     --username scott \
     --password 123456 \
     --table EMP \
     --where 'comm is null' \
     --target-dir /test/emp1 \
     --delete-target-dir \
     --num-mappers 1 \
     --fields-terminated-by ','

 

     --通过查询语句进行数据的导入 --query 查询语句
     sqoop import \
     --connect jdbc:oracle:thin:@192.168.1.101:1521:orcl1 \
     --username scott \
     --password 666666 \
     --query 'select e.*,d.dname,d.loc from emp e ,dept d where e.deptno=d.deptno and e.sal>1500 and $CONDITIONS' \
     --target-dir /test/emp2 \
     --delete-target-dir \
     --num-mappers 1 \
     --fields-terminated-by ','

 

     注意:1.table和query同时只能设置1个
        2.在查询语句后面如果有where条件查询,则需要在后面添加一个and $CONDITIONS
     导出数据:export :将hdfs上的数据文件导入到关系库中,必须要先创建好对应的表。
     将hdfs平台上的数据文件到入到mysql的test_t1表中
     sqoop export \
     --connect jdbc:mysql://192.168.1.101:3306/test \
     --username root \
     --password 123456 \
     --table test_t1 \
     --export-dir /test/demo \
     --num-mappers 1 \
     --fields-terminated-by ',' \
     --driver com.mysql.jdbc.Driver

 

     --将hdfs上的数据导入到Oracle数据库中
     sqoop export \
     --connect jdbc:oracle:thin:@192.168.1.101:1521:orcl1 \
     --username scott \
     --password 123456 \
     --table EMP_TEST \
     --export-dir /test/emp1 \
     --num-mappers 1 \
     --fields-terminated-by ',' \

 

二. 增量导入数据:

  在实际的业务中,如果由一些表的数据量不是很大,并且增长速度也不是很快,则可以采用全量到数据的方式。
  但是如果表中的数据量很大,并且增长速度也很快,则建议使用增量导入数据。

  sqoop中两种增量方式:

   1. append:通过主键来判定

   2. lastmodified:以最后修改的时间进行判断,要求表中必须存在一个时间段

  使用sqoop进行增量时使用的命令:

  --check-column:用来设置判断数据的信息是否新增,该字段只能是数字类型或者时间类型

  --incremental:设置增量方式

  --last-value:设置最后一个值

  --append:重新生成一个文件,将增量数据放到新的文件中

  --merge-key:合并数据,在增量的时候对指定的数据字段进行合并

  

  --将mysql数据库中test_t表中的数据进行增量导入到hdfs平台上

  --判断方式以主键的形式进行判定,并且以追加的形式来增量

   sqoop import \

   --connect jdbc:mysql://192.168.1.101:3306/test \

   --username root \

   --password 123456 \

   --table test_t \

   --target-dir /test/demo \

   --num-mappers 1 \

   --fields-terminated-by ',' \

   --driver com.mysql.jdbc.Driver \

   --check-column id \

   --incremental append \

   --last-value 4 \

   --append

 

  --使用增量导入的方式将user_t表中的数据导入到hdfs平台上
  --增量判断的字段lasttime,并且以追加的方式进行增量

   sqoop import \
   --connect jdbc:mysql://192.168.1.65:3306/test \
   --username root \
   --password 123456 \
   --table user_t \
   --target-dir /test/user_t \
   --num-mappers 1 \
   --fields-terminated-by ',' \
   --driver com.mysql.jdbc.Driver \
   --check-column lasttime \
   --incremental lastmodified \
   --last-value '2022-06-24 14:56:47.0' \
   --append

 

  --使用增量导入的方式将user_t表中的数据导入到hdfs平台上
  --增量判断的字段lasttime,并且以合并的方式进行增量

   sqoop import \
   --connect jdbc:mysql://192.168.1.65:3306/test \
   --username root \
   --password 123456 \
   --table user_t \
   --target-dir /test/user_t1 \
   --num-mappers 1 \
   --fields-terminated-by ',' \
   --driver com.mysql.jdbc.Driver \
   --check-column lasttime \
   --incremental lastmodified \
   --last-value '2022-06-24 15:26:57.0' \
   --merge-key id            --用来指定合并的字段

 

三.使用sqoop中的job(任务)
  常用命令:
   1.创建任务:
    sqoop job --create 任务名
   2.删除任务:
    sqoop job --delete 任务名
   3.查看任务列表
    sqoop job --list 任务名
   4.执行任务
    sqoop job --exec 任务名

  注意:使用sqoop的任务的时候必须要添加两个json的jar包

 

  --创建一个sqoop的任务:增量导入user_t中的数据到hdfs平台
   sqoop job --create myjob1 -- import \
   --connect jdbc:mysql://192.168.1.65:3306/test \
   --username root \
   --password 123456 \
   --table user_t \
   --target-dir /test/user_t2 \
   --num-mappers 1 \
   --fields-terminated-by ',' \
   --driver com.mysql.jdbc.Driver \
   --check-column lasttime \
   --incremental lastmodified \
   --last-value '2022-06-24 15:26:57.0' \
   --merge-key id


  在执行sqoop的任务的时候需要输入密码,所在在实际的工作中都会设置免密登录。
   1.创建一个密码文件,将数据库中的密码保存
    echo -n '123456' >passwd.pwd
   2.在hdfs上创建一个文件夹来保存密码文件
    hdfs dfs -mkdir -p /passwd/pwd
   3.将创建的密码文件上传到hdfs对应的文件夹下
    hdfs dfs -put passwd.pwd /passwd/pwd
   4.在写导入的命令的时候不用设置password,但是要设置password-file用来指定密码存放的位置

    sqoop job --create myjob2 -- import \
    --connect jdbc:mysql://192.168.1.65:3306/test \
    --username root \
    --password-file '/passwd/pwd/passwd.pwd' \
    --table user_t \
    --target-dir /test/user_t2 \
    --num-mappers 1 \
    --fields-terminated-by ',' \
    --driver com.mysql.jdbc.Driver \
    --check-column lasttime \
    --incremental lastmodified \
    --last-value '2022-06-24 15:26:57.0' \
    --merge-key id


  使用Linux中的定时任务来调度sqoop中的任务(job):
   1.创建一个定时任务:
    crontab -e
   2.在定时任务重添加一下内容
    */10 * * * * /root/sqoop1.4/bin/sqoop job --exec myjob2 > myjob.log 2>&1


  修改/root/hadoop2.7/etc/hadoop/hadoop-env.sh文件
  将里面的export JAVA_HOME=jdk路径
  export JAVA_HOME=/root/jdk1.8

posted @   Luo_YB  阅读(134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示