前言
之前写过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');
|
同时插入两条数据
数据显示为
(导入数据前必须保证集群的时间同步完成,因为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中的相应文件夹中查看的相应的文件数据
数据显示如下
part中的内容是这样的
查询导入
[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的内容是这样的
如果 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是这样的结果
注意: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" #筛选条件
|
这时结果为
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里看到新添加的表
查看一下数据
添加完成
导出数据
注意: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中查看
注意:导出数据时,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表中的数据而还原
清空后,重新成功导入