概述

sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。

  • 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系

统;

  • 导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等

image.png

安装

安装sqoop的前提是已经具备了java和hadoop的环境

下载解压

下载地址:http://archive.apache.org/dist/sqoop/1.4.7
sqoop1版本详细下载地址 :http://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
sqoop2版本详细下载地址 :http://archive.apache.org/dist/sqoop/1.99.6/sqoop-1.99.6-bin-hadoop200.tar.gz
我们这里使用sqoop1的版本,下载之后上传到/export/softwares目录下,然后进行解压

  1. cd /export/softwares
  2. tar -zxvf sqoop-1.4.6-cdh5.14.0.tar.gz -C ../servers/

修改配置文件

cd /export/servers/hadoop‐3.1.1/conf/ 
cp sqoop‐env‐template.sh sqoop‐env.sh 
vim sqoop‐env.sh
export HADOOP_COMMON_HOME/export/servers/hadoop‐3.1.1 
export HADOOP_MAPRED_HOME=/export/servers/hadoop‐3.1.1 
export HIVE_HOME=/export/servers/apache‐hive‐3.1.1‐bin

加入额外的依赖包

sqoop的使用需要添加两个额外的依赖包,一个是mysql的驱动包,一个是java-json的的依赖包,不然就会报错。mysql-connector-java-5.1.40.jar 、java-json.jar 将这两个包添加到sqoop的lib目录下

验证启动

cd /export/servers/sqoop-1.4.7.bin__hadoop-2.6.0 
bin/sqoop-version

sqoop数据的导入

常用命令

#列举所有数据库
bin/sqoop list‐databases ‐‐connect jdbc:mysql://192.168.1.7:3306/ ‐‐ username root ‐‐password root

# 查看某一个数据库下面的数据表
bin/sqoop list‐tables ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐ username root ‐‐password root

在mysqk中有个库userdb,有三个表:emp、emp_add、emp_conn
表emp:
image.png表emp_add:
image.png
表emp_conn:
image.png

导入数据库表到hdfs

下面的命令用于从mysql数据库服务器中的emp表导入hdfs(底层走的是MapReduce),

  • —target-dir 指定导出目录,如果不指定默认导入到/user/root/
  • —delete-target-dir来判断导出目录是否存在,存在则删掉
  • —m指定mapreduce的个数
  • ‐‐fields‐terminated‐by 如果不指定导出分隔符,则为逗号
    bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb 
    ‐‐ username root ‐‐password root ‐‐delete‐target‐dir 
    ‐‐table emp ‐‐target‐dir /sqoop/emp 
    ‐‐m 1 ‐‐fields‐terminated‐by '\t'
    
    查看文件内容:hdfs dfs -text /sqoop/emp/part-m-0000
    image.png

    导入关系表到hive

  1. 拷贝jar包

将我们的mysql表中的数据直接导入到hive表中的话,我们需要将hive的一个叫做hive-exec-3.1.1.jar的jar包拷贝到sqoop的lib目录

cp /export/servers/apache‐hive‐3.1.1‐bin/lib/hive‐exec‐3.1.1.jar 
/export/servers/sqoop‐1.4.7.bin__hadoop‐2.6.0/lib
  1. 准备hive数据库和表 ```shell hive (default)> create database sqooptohive;

hive (default)> use sqooptohive;

行分隔符\001

hive (sqooptohive)> create external table emp_hive(id int,name string,deg string,salary int ,dept string) row format delimited fields terminated by ‘\001’;


3. 开始导入
- ‐‐hive‐overwrite  数据覆盖
```shell
bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐ username root ‐‐password root ‐‐table emp ‐‐fields‐terminated‐by '\001' ‐ ‐hive‐import ‐‐hive‐table sqooptohive.emp_hive ‐‐hive‐overwrite ‐‐delete‐ target‐dir ‐‐m 1
  1. hive表数据查看
    select * from emp_hive;
    

    自动创建hive表

    我们也可以通过命令将我们的mysql的表直接导入到hive表当中去,用的就是这个参数 ‐‐hive‐database 会自动帮我们创建,这种也更简单,推荐这一种。
    bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐ username root ‐‐password root ‐‐table emp_conn ‐‐hive‐import ‐m 1 ‐‐hive‐database sqooptohive
    

增量导入

在实际工作当中,数据的导入,很多时候都是只需要导入增量的数据即可,并不需要将表中全部的数据导入到hive或者hdfs,肯定会出现重复数据的情况。所以一般我们都是选用一些字段进行增量导入,为了支持增量导入,sqoop也给我们考虑到了这种情况并且支持增量的导入数据。
增量导入是仅导入新添加的表中的行的技术,它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。下面的语法用途sqoop导入命令增量选项。注意:增量导入的时候,一定不能加参数—delete-target-dir否则会报错
导入emp表当中id大于1202的所有数据

bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐username root ‐‐password root ‐‐table emp ‐‐incremental append  
‐‐check‐column id ‐‐last‐value 1202  ‐m 1 
‐‐target‐dir /sqoop/increment

where参数来来导入我们想要的数据,以导入hdfs举例

bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐username root ‐‐password admin ‐‐table emp ‐‐incremental append ‐‐where "create_time > '2018‐06‐17 00:00:00' and create_time < '2018‐06‐ 17 23:59:59'" 
‐‐target‐dir /sqoop/incement2 
‐‐check‐column id ‐‐m 1

sqoop数据导出

hdfs导出到mysql

将数据从hdfs把文件导出到mysql数据库,导出前目标表必须存在于目标数据库中。数据是在hdfs当中/sqoop/emp,数据内容如下:

1201,gopal,manager,50000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1 1202,manisha,Proof reader,50000,TP,2018-06-15 18:54:32.0,2018-06-17 20:26:08.0,1 1203,khalil,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1 1204,prasanth,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 21:05:52.0,0 1205,kranthi,admin,20000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
  1. 创建mysql表

    CREATE TABLE emp_out (
    id INT(11) DEFAULT NULL, 
    name VARCHAR(100) DEFAULT NULL,
    deg VARCHAR(100) DEFAULT NULL, 
    salary INT(11) DEFAULT NULL, 
    dept VARCHAR(10) DEFAULT NULL, 
    create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP, 
    is_delete BIGINT(20) DEFAULT '1' 
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;
    
  2. 执行导出命令

    bin/sqoop export ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐username root ‐‐password root ‐‐table emp_out ‐‐export‐dir /sqoop/emp  ‐‐input‐fields‐terminated‐by ","
    
  3. 查看验证mysql表数据