前言

之前写过Sqoop的安装,现在学到了Sqoop的使用,所以写点Sqoop的使用

测试Sqoop能否连接上mysql

虽然我们在之前的Sqoop的安装上做过测试了,但是我们再做一次也无妨

输入

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

可以看到mysql上的数据库名称,证明Sqoop是可以正常使用的

Sqoop的简单使用案例

导入数据

在Sqoop中的导入数据与我们一般理解的导入数据不同,Sqoop中的导入数据是指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。

RDBMS到HDFS

我们先在mysql创建一个新的数据库,叫做company

mysql> create database company;
mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));
mysql> insert into company.staff(name, sex) values('Thomas', 'Male');
mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale');

同时插入两条数据

数据显示为

mark

(导入数据前必须保证集群的时间同步完成,因为sqoop的本质就是在跑mr代码,如果时间不同步运行mr时会出现问题)

全部导入
[root@master sqoop-1.4.7]# bin/sqoop import \
--connect jdbc:mysql://master:3306/company \ #MySQL数据库的数据库端口和数据库名称
--username root \ #mysql数据库用户
--password 000000 \ #mysql密码
--table staff \ #mysql中的表名
--target-dir /user/company \ #导入到hdfs上的位置
--delete-target-dir \ #如果存在相同文件夹删除
--fields-terminated-by "\t" #按\t分割

导入成功后,就可以在hdfs中的相应文件夹中查看的相应的文件数据

数据显示如下

mark

part中的内容是这样的

mark

查询导入
[root@master sqoop-1.4.7]# bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 123456 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;' #查询条件

导入成功后,就可以在hdfs中的相应文件夹中查看的相应的文件数据

这里的part的内容是这样的

mark

如果 query 后使用的是双引号,则$CONDITIONS 前必须加转义字符,防止 shell 识别为自己的变量

例如:

[root@master sqoop-1.4.7]#bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 123456 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query "select name,sex from staff where id <=1 and \$CONDITIONS;"
导入指定列
[root@master sqoop-1.4.7]#bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 123456 \
--columns id,sex \ #列名
--table staff
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \

导入完成在part是这样的结果

mark

注意:columns 中如果涉及到多列,用逗号分隔,分隔时不要添加空格

使用 sqoop 关键字筛选查询导入数据
[root@master sqoop-1.4.7]#bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 123456 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1" #筛选条件

这时结果为

mark

RDBMS到Hive

[root@master sqoop-1.4.7]#bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 123456 \
--table staff \
--num-mappers 1 \
--hive-import \ #导入hive的关键字
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive #hive的表名

如果报错基本是jar包的问题

在把hive的的lib下的hive-common-1.1.0.jar 和hive-exec-1.1.0.jar放到sqoop的lib下去

再去跑代码

如果还报错自行百度

RDBMS到HBASE

[root@master sqoop-1.4.7]# bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 123456 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id

这样运行成功后,我们能在hbase里看到新添加的表

mark

查看一下数据

mark

添加完成

导出数据

注意:hbase不支持导出到mysql

HIVE/HDFS 到 RDBMS

因为hive的数据实际上是存在hdfs上的,所以hdfs/hive导出数据到mysql都是一个意思

我们在从hive导出数据时,可以先把之前mysql的staff表清空

mysql> create table staff;
mysql> select * from staff;
Empty set (0.00 sec)

然后在导出

[root@master sqoop-1.4.7]# bin/sqoop export \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 123456 \
--table staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"

运行成功后,我们回到mysql中查看

mark

注意:导出数据时,mysql如果没有表,是不会自动创建的

脚本执行

我们在学习中,自己打命令去导入导出是可以的

但是在实际生产环境中,是不太可能让我们自己去打这些东西的,一般都是编写脚本完成后,去定时启动任务

这里简单测试一个脚本

定义一个sqp.opt脚本在sqoop的job目录下,job文件夹是自己mkdir的

脚本内容如下

export
--connect
jdbc:mysql://master:3306/company
--username
root
--password
123456
--table
staff
--num-mappers
1
--export-dir
/user/hive/warehouse/staff_hive
--input-fields-terminated-by
"\t"

脚本意义是从hive导出数据到mysql

使用前记得把mysql原来的staff表清空

不然会因为id冲突而报错

执行脚本

[root@master sqoop-1.4.7]# bin/sqoop --options-file job/sqp.opt 

执行成功,我们清空的staff表的数据会根据hive表中的数据而还原

mark

清空后,重新成功导入