1 导入数据
在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。
1.1 RDBMS到HDFS
1.1.1 确定Mysql服务开启正常
1.1.2 在Mysql中新建一张表并插入一些数据
mysql> create database school;
mysql> create table school.student(id int(4) primary key not null auto_increment,name varchar(255),sex varchar(255));
mysql> insert into school.student(name,sex) values('LY','female');
mysql> insert into school.student(name,sex) values('CMH','male');
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| metastore |
| mysql |
| performance_schema |
| school |
| test |
+--------------------+
6 rows in set (0.00 sec)
mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| student |
+------------------+
1 row in set (0.00 sec)
mysql> select * from student;
+----+------+--------+
| id | name | sex |
+----+------+--------+
| 1 | LY | female |
| 2 | CMH | male |
+----+------+--------+
2 rows in set (0.00 sec)
1.1.3 导入数据
1)全部导入
[caimh@master-node sqoop-1.4.6]$ bin/sqoop import \
> --connect jdbc:mysql://master-node:3306/school \
> --username root \
> --password 111111 \
> --table student \
> --target-dir /user/school \
> --delete-target-dir \
> --num-mappers 1 \
> --fields-terminated-by "\t"
注意:linux命令换行输入,空格+'\',再输入enter键即可。否则,直接执行命令了。
查看HDFS,如下图,数据已经导入。
2)查询导入
[caimh@master-node sqoop-1.4.6]$ bin/sqoop import \
> --connect jdbc:mysql://master-node:3306/school \
> --username root \
> --password 111111 \
> --target-dir /user/school \
> --delete-target-dir \
> --num-mappers 1 \
> --fields-terminated-by "\t" \
> --query 'select name,sex from student where id <=1 and $CONDITIONS;'
提示1:must contain '$CONDITIONS' in WHERE clause.保证多个mapper最终输出的数据市有序的。
提示2:如果query后使用的是双引号,则$CONDITIONS前必须加转义符,防止shell识别为自己的变量。
提示3:--query选项,不能同时与--table选项使用
HDFS查询数据,如下图显示
3)导入指定列
[caimh@master-node sqoop-1.4.6]$ bin/sqoop import \
> --connect jdbc:mysql://master-node:3306/school \
> --username root \
> --password 111111 \
> --target-dir /user/school \
> --delete-target-dir \
> --num-mappers 1 \
> --fields-terminated-by "\t" \
> --columns id,sex \
> --table student
提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格
查看HDFS数据,如下图
4)使用sqoop关键字筛选查询导入数据
[caimh@master-node sqoop-1.4.6]$ bin/sqoop import \
> --connect jdbc:mysql://master-node:3306/school \
> --username root \
> --password 111111 \
> --target-dir /user/school \
> --delete-target-dir \
> --num-mappers 1 \
> --fields-terminated-by "\t" \
> --table student \
> --where "id=1"
提示:在Sqoop中可以使用sqoop import -D property.name=property.value这样的方式加入执行任务的参数,多个参数用空格隔开。
查看HDFS数据,如下图
1.2 RDBMS到Hive
[caimh@master-node sqoop-1.4.6]$ bin/sqoop import \
> --connect jdbc:mysql://master-node:3306/school \
> --username root \
> --password 111111 \
> --table student \
> --num-mappers 1 \
> --hive-import \
> --fields-terminated-by "\t" \
> --hive-overwrite \
> --hive-table student_hive
提示:该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库
提示:第一步默认的临时目录是/user/admin/表名
运行过程中,查看HDFS临时目录
查看hive数据,已经生成了student_hive表
问题:我导入数据的时候报错,详见下面问题1
1.3 RDBMS到HBASE
(1)启动hbase
[caimh@master-node hbase-1.3.1]$ bin/start-hbase.sh --启动hbase
(2)执行导入命令
[caimh@master-node sqoop-1.4.6]$ bin/sqoop import \
> --connect jdbc:mysql://master-node:3306/school \
> --username root \
> --password 111111 \
> --table student \
> --columns "id,name,sex" \
> --column-family "info" \
> --hbase-create-table \
> --hbase-row-key "id" \
> --hbase-table "hbase_student" \
> --num-mappers 1
提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能(jar包不兼容)
解决方案:手动创建HBase表
hbase(main):002:0> create 'hbase_student','info' --创建hbase_student表
hbase(main):003:0> list --查看
TABLE
hbase_student
user_info
2 row(s) in 0.0210 seconds
=> ["hbase_student", "user_info"]
执行导入命令过程中报错了,见下面问题2
(3)再次执行导入命令,在HBase中scan这张表得到如下内容
hbase(main):004:0> scan 'hbase_student'
ROW COLUMN+CELL
1 column=info:name, timestamp=1571333312429, value=LY
1 column=info:sex, timestamp=1571333312429, value=female
2 column=info:name, timestamp=1571333312429, value=CMH
2 column=info:sex, timestamp=1571333312429, value=male
2 row(s) in 0.4900 seconds
hbase(main):005:0>
2 导出数据
在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。
2.1 HIVE/HDFS到RDBMS
(1)执行导出数据命令。(由于已经存在student表,所以这里用student_cp表操作)
bin/sqoop export \
--connect jdbc:mysql://master-node:3306/school \
--username root \
--password 111111 \
--table student_cp \
--num-mappers 1 \
--export-dir /user/hive/warehouse/student_hive \
--input-fields-terminated-by "\t"
提示:Mysql中如果表不存在,不会自动创建
解决方案:创建student_cp表
mysql> create table school.student_cp(id int(4) primary key not null auto_increment,name varchar(255),sex varchar(255))
-> ;
Query OK, 0 rows affected (0.05 sec)
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| student |
| student_cp |
+------------------+
2 rows in set (0.00 sec)
mysql> describe student_cp;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| sex | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
(2)再次执行(1)命令,查看数据
mysql> select * from student_cp;
+----+------+--------+
| id | name | sex |
+----+------+--------+
| 1 | LY | female |
| 2 | CMH | male |
+----+------+--------+
2 rows in set (0.01 sec)
3 脚本打包
使用opt格式的文件打包sqoop命令,然后执行。
通常,不会手动去执行一个任务,每天定时任务去执行任务,将任务打包到文件中,通过sqoop执行。
(1)创建一个.opt文件,编写sqoop脚本
[caimh@master-node sqoop-1.4.6]$ mkdir opt
[caimh@master-node sqoop-1.4.6]$ vim opt/job_hdfs2rdbms.opt
export
--connect
jdbc:mysql://master-node:3306/school
--username
root
--password
111111
--table
student
--num-mappers
1
--export-dir
/user/hive/warehouse/student_hive
--input-fields-terminated-by
"\t"
(2)执行该脚本
由于之前student表中有数据,首先清空表student数据
mysql> truncate table student;
Query OK, 0 rows affected (0.04 sec)
mysql> select * from student;
Empty set (0.00 sec)
[caimh@master-node sqoop-1.4.6]$ bin/sqoop --options-file opt/job_hdfs2rdbms.opt
(3)检查数据
mysql> select * from student;
+----+------+--------+
| id | name | sex |
+----+------+--------+
| 1 | LY | female |
| 2 | CMH | male |
+----+------+--------+
2 rows in set (0.01 sec)
4 问题
问题1:ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Cannot run program "hive": error=2, 没有那个文件或目录。
原因分析:
这个异常 Cannot run program "hive": error=2, No such file or directory是说Sqoop没有找到Hive,原因是hive没有设置环境变量
解决方案:
1.vim /etc/profile (切换root用户)
2.source /etc/profile
[caimh@master-node ~]$ sudo vim /etc/profile
[caimh@master-node ~]$ source /etc/profile
#HIVE_HOME配置
export HIVE_HOME=/opt/module/hive-1.2.2
export PATH=$PATH:$HIVE_HOME/bin
问题2:ERROR tool.ImportTool: Error during import: HBase jars are not present in classpath, cannot import to HBase!
导入期间出错:类路径中不存在HBase jar,无法将其导入到HBase
原因分析:
类路径中找不到运行需要的HBase相关jar包,在/etc/profile中没有设置HBASE环境变量(HBASE_HOME,PATH)
解决方案:
在/etc/profile中设置HBASE环境变量
[caimh@master-node sqoop-1.4.6]$ sudo vim /etc/profile
#HBASE_HOME配置
export HBASE_HOME=/opt/module/hbase-1.3.1
export PATH=$PATH:$HBASE_HOME/bin
[caimh@master-node sqoop-1.4.6]$ source /etc/profile