Sqoop导入导出数据简单案例详解

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值