Sqoop安装及案例导入导出数据(基于Hadoop环境)

  • Sqoop主要用于在Hadoop(Hive)与传统的数据库MySQL间进行数据的传递
  • 可以将一个关系型数据库(如:MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
  • 原理:将导入或导出命令翻译成mapreduce程序来实现
  • 在翻译出的mapreduce中主要是对inputformat和outputformat进行定制

一、Sqoop的安装

1、将Sqoop的安装包拷贝到/opt/software目录下
[mnlg@XJ202 ~]$ cd /opt/software/
//解压安装包
[mnlg@XJ202 software]$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/
[mnlg@XJ202 software]$ cd /opt/module/
[mnlg@XJ202 module]$ ll
//修改安装包名称
[mnlg@XJ202 module]$ mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha/ sqoop-1.4.6
[mnlg@XJ202 module]$ ll
2、修改配置文件
[mnlg@XJ202 module]$ cd sqoop-1.4.6/
[mnlg@XJ202 sqoop-1.4.6]$ ll
[mnlg@XJ202 sqoop-1.4.6]$ cd conf/
[mnlg@XJ202 conf]$ ll
//修改配置文件名称
[mnlg@XJ202 conf]$ mv sqoop-env-template.sh sqoop-env.sh
3、添加配置文件内容
[mnlg@XJ202 conf]$ vim sqoop-env.sh
//将以下内容取消注释,并修改文件路径位置
export HADOOP_COMMON_HOME=/opt/module/hadoop-3.1.3
export HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3
export HBASE_HOME=/opt/module/hbase-2.3.6
export HIVE_HOME=/opt/module/hive-3.1.2
export ZOOCFGDIR=/opt/module/zookeeper-3.5.7

//可新开个窗口,查看各文件位置
[mnlg@XJ202 ~]$ cd /opt/module/hadoop-3.1.3/
[mnlg@XJ202 hadoop-3.1.3]$ pwd
/opt/module/hadoop-3.1.3

[mnlg@XJ202 hadoop-3.1.3]$ cd ..
[mnlg@XJ202 module]$ cd hbase-2.3.6/
[mnlg@XJ202 hbase-2.3.6]$ pwd
/opt/module/hbase-2.3.6

[mnlg@XJ202 hbase-2.3.6]$ cd ..
[mnlg@XJ202 module]$ cd hive-3.1.2/
[mnlg@XJ202 hive-3.1.2]$ pwd
/opt/module/hive-3.1.2

[mnlg@XJ202 module]$ cd zookeeper-3.5.7/
[mnlg@XJ202 zookeeper-3.5.7]$ pwd
/opt/module/zookeeper-3.5.7
4、拷贝JDBC驱动
[mnlg@XJ202 ~]$ cd /opt/module/hive-3.1.2/
[mnlg@XJ202 hive-3.1.2]$ ll
[mnlg@XJ202 hive-3.1.2]$ cd lib/
//拷贝文件
[mnlg@XJ202 lib]$ cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop-1.4.6/lib/

[mnlg@XJ202 lib]$ cd /opt/module/sqoop-1.4.6/lib/
[mnlg@XJ202 lib]$ ll
[mnlg@XJ202 lib]$ cd ..
//验证Sqoop配置是否正确
[mnlg@XJ202 sqoop-1.4.6]$ bin/sqoop help
//生成Available commands:。。。。等即配置正确
[mnlg@XJ202 sqoop-1.4.6]$ mysql -uroot -p
mysql> quit;
5、 测试Sqoop是否能够成功连接数据库
//  '\'是表示换行,语句还未写完
[mnlg@XJ202 sqoop-1.4.6]$ bin/sqoop list-databases --connect jdbc:mysql://XJ202:3306/ \
> --username root \
> --password 000000

二、案例(Sqoop方式将数据导入到hdfs中)

  • 在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字
  • 在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字
1、保证MySQL服务开启正常
[mnlg@XJ202 ~]$ my_hadoop.sh start				 //启动集群
[mnlg@XJ202 ~]$ mysql -uroot -p					 //进入mysql
2、MySQL中新建表并插入一些数据
mysql> create database company;					//新建数据库
mysql> use company;								//一定要use,不然会报错
//新建表
mysql> create table staff(id int primary key auto_increment,name varchar(20),sex varchar(20));
mysql> show tables;								//查看有哪些表
+-------------------+
| Tables_in_company |
+-------------------+
| staff             |
+-------------------+
1 row in set (0.00 sec)
    
mysql> desc staff;						 	    //查看表字段信息
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| sex   | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.10 sec)    
//插入数据
mysql> insert into staff values (null,'tom','male');
mysql> insert into staff values (null,'jary','female');
mysql> select * from staff;
mysql> quit;
3、导入数据(之后记得去浏览器端口查看是否有company文件夹)
//第三行‘XJ202’根据需求进行更改
[mnlg@XJ202 sqoop-1.4.6]$ bin/sqoop import \	//导入
--connect jdbc:mysql://XJ202:3306/company \		//连接的端口
--username root \								//连接名
--password 000000 \								//连接的密码
--table staff \									//导入数据的表名
--target-dir /company \							//导入数据放在文件夹company下
--num-mappers 1 \								//设置map的任务数量为1
--fields-terminated-by "\t"						//通过换行来分隔字段
4、导出数据(不可使用之前的staff表,需新建表)
[mnlg@XJ202 sqoop-1.4.6]$ mysql -uroot -p
mysql> use company;
mysql> create table staff1(id int primary key auto_increment,name varchar(20),sex varchar(20));
mysql> show tables;
+-------------------+
| Tables_in_company |
+-------------------+
| staff             |
| staff1            |
+-------------------+
2 rows in set (0.00 sec)

mysql> quit;
5、导出数据(HIVE/HDFS到RDBMS)
//第三行‘XJ202’根据需求进行更改
[mnlg@XJ202 sqoop-1.4.6]$ bin/sqoop export \
--connect jdbc:mysql://XJ202:3306/company \
--username root \
--password 000000 \
--table staff1 \
--num-mappers 1 \
--export-dir /company/part-m-00000 \		//这里采用刚刚导入数据来进行导出(即将part-m-00000文件内容进行导出)
--input-fields-terminated-by "\t"
6、查看数据是否导出成功
[mnlg@XJ202 sqoop-1.4.6]$ mysql -uroot -p
mysql> use company;
mysql> select * from staff1;			  //查看staff1表中是否有数据
+----+------+--------+
| id | name | sex    |
+----+------+--------+
|  1 | tom  | male   |
|  2 | jary | female |
+----+------+--------+
2 rows in set (0.00 sec)