下载和解压 Sqoop
tar -zxvf /opt/software/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/src
将解压后生成的 sqoop-1.4.7.bin__hadoop-2.6.0 文件夹更名为 sqoop
[root@master ~]# cd /usr/local/src/
[root@master src]#mv /sqoop-1.4.7.bin__hadoop-2.6.0 sqoop
配置sqoop环境
步骤一:创建 Sqoop 的配置文件 sqoop-env.sh
复制 sqoop-env-template.sh 模板,并将模板重命名为 sqoop-env.sh
[root@master ~]# cd /usr/local/src/sqoop/conf/
[root@master conf]# cp sqoop-env-template.sh sqoop-env.sh
步骤二:修改 sqoop-env.sh 文件,添加 Hdoop、Hbase、Hive 等组件的安装路径。
注意:下面各组件的安装路径需要与实际环境中的安装路径保持一致
[root@master conf]# vi sqoop-env.sh
export HADOOP_COMMON_HOME=/usr/local/src/hadoop
export HADOOP_MAPRED_HOME=/usr/local/src/hadoop
export HBASE_HOME=/usr/local/src/hbase
export HIVE_HOME=/usr/local/src/hive
步骤三:配置 Linux 系统环境变量,添加 Sqoop 组件的路径
[root@master conf]# vi /etc/profile
#在文件末尾添加
# set sqoop environment
export SQOOP_HOME=/usr/local/src/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
export CLASSPATH=$CLASSPATH:$SQOOP_HOME/lib
修改权限为Hadoop用户
[root@master src]#chown -R hadoop:hadoop sqoop
步骤四:连接数据库
注意:为了使 Sqoop 能够连接 MySQL 数据库,需要将/opt/software/mysql-connector-jav
a-5.1.46.jar 文件放入 sqoop 的 lib 目录中。该 jar 文件的版本需要与 MySQL 数据库的
版本相对应,否则 Sqoop 导入数据时会报错。
[root@master ~]# cp /opt/software/mysql-connector-java-5.1.46.jar /usr/local/src/sqoop/lib/
启动 Sqoop
步骤一:执行 Sqoop 前需要先启动 Hadoop 集群
注:在 master 节点切换到 hadoop 用户执行 start-all.sh 命令启动 Hadoop 集群。
[root@master ~]# su - hadoop
[hadoop@master ~]$ source /etc/profile
[hadoop@master ~]$ start-all.sh
步骤二:检查 Hadoop 集群的运行状态。
[hadoop@master ~]$ jps
57921 NodeManager
57764 ResourceManager
57238 DataNode
57447 JournalNode
57992 Jps
57642 DFSZKFailoverController
57100 NameNode
步骤三:测试 Sqoop 是否能够正常连接 MySQL 数据库
能 够 查 看 到 MySQL 数 据 库 中 的 information_schema 、 hive 、 mysql 、performance_schema、sys 等数据库,说明 Sqoop 可以正常连接 MySQL。
[hadoop@master ~]$ sqoop list-databases --connect jdbc:mysql://127.0.0.1:3306/ --username root -P
21/04/19 12:42:27 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
Enter password:
21/04/19 12:42:34 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
Mon Apr 19 12:42:34 CST 2021 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
information_schema
hive
mysql
performance_schema
sample
sys
步骤四:连接 hive
为了使 Sqoop 能够连接 Hive,需要将 hive 组件/usr/local/src/hive/lib 目录下的hive-common-2.0.0.jar 也放入 Sqoop 安装路径的 lib 目录中。
[hadoop@master ~] $ cp /usr/local/src/hive/lib/hive-common-2.0.0.jar /usr/local/src/sqoop/lib/
Sqoop 模板命令
步骤一:创建 MySQL 数据库和数据表。
# 登录 MySQL 数据库
[hadoop@master ~]$ mysql -uroot -p
Enter password:
# 创建 sample 库
mysql> create database sample;
Query OK, 1 row affected (0.00 sec)
# 使用 sample 库
mysql> use sample;
Database changed
mysql> create table student(number char(9) primary key, name varchar(10));
Query OK, 0 rows affected (0.01 sec)
# 创建 student 表,该数据表有number 学号和 name 姓名两个字段
# 向 student 表插入几条数据
mysql> insert into student values('01','zhangsan');
Query OK, 1 row affected (0.05 sec)
mysql> insert into student values('02','lisi');
Query OK, 1 row affected (0.01 sec)
mysql> insert into student values('03','wangwu');
Query OK, 1 row affected (0.00 sec)
# 查询 student 表的数据
mysql> select * from student;
+--------+----------+
| number | name |
+--------+----------+
| 01 | zhangsan |
| 02 | lisi |
| 03 | wangwu |
+--------+----------+
3 rows in set (0.00 sec)
mysql> exit;
步骤二:在 Hive 中创建 sample 数据库和 student 数据表。
[hadoop@master ~]$ hive # 启动 hive 命令行
hive> create database sample; # 创建 sample 库
hive> show databases; # 查询所有数据库
hive> use sample; # 使用 sample 库
hive> create table student(number STRING, name STRING);# 创建 student 表
hive> exit; # 退出 hive 命令行
步骤三:从 MySQL 导出数据,导入 Hive
[hadoop@master ~]$sqoop import --connect jdbc:mysql://master:3306/sample --username root --password Password123$ --table student --fields-terminated-by '|' --delete-target-dir --num-mappers 1 --hive-import --hive-database sample --hive-table student
删除 MySQL 数据, student 表中 number 为主键,添加信息导致主键重复,报错,所以删除表数据
[hadoop@master ~]$mysql -u root -p
mysql>use sample;
mysql>delete from student;
mysql>exit;
步骤四:从 Hive 导出数据,导入到 MySQL
[hadoop@master ~]$sqoop export --connect "jdbc:mysql://master:3306/sample?useUnicode=true&characterEncoding=utf-8" --username root --password Password123$ --table student --input-fields-terminated-by '|' --export-dir /user/hive/warehouse/sample.db/student/*
Sqoop 组件应用
(1)列出 MySQL 数据库中的所有数据库
[hadoop@master ~]$ sqoop list-databases -connect jdbc:mysql://localhost:3306/ -username root -password Password123$
(2)连接 MySQL 并列出 sample 数据库中的表
[hadoop@master ~]$sqoop list-tables -connect jdbc:mysql://localhost:3306/sample -username root -password Password123$
(3)将关系型数据的表结构复制到 hive 中,只是复制表的结构,表中的内容没有复制过去
[hadoop@master ~]$sqoop create-hive-table -connect jdbc:mysql://localhost:3306/sample -table student -username root -password Password123$ -hive-table test
其中–table student 为 MySQL 中的数据库 sample 中的表–hive-table test 为 hive中新建的表名称
(4)从关系数据库导入文件到 Hive 中
[hadoop@master ~]$sqoop import --connect jdbc:mysql://master:3306/sample --username root --password Password123$ --table student --delete-target-dir --num-mappers 1 --hive-import --hive-database default --hive-table test
(5)将 Hive 中的表数据导入到 MySQL 中,在进行导入之前,MySQL 中的表hive_test 表必须已经提前创建好
删除 MySQL 数据, student 表中 number 为主键,添加信息导致主键重复,报错,所以删除表数据
[hadoop@master ~]$mysql -u root -p
mysql>use sample;
mysql>delete from student;
mysql>exit;
[hadoop@master ~]$sqoop export --connect jdbc:mysql://master:3306/sample --username root --password Password123$ --table student --input-fields-terminated-by '\001' --export-dir /user/hive/warehouse/test
(6)从数据库导出表的数据到 HDFS 上文件
[hadoop@master ~]$sqoop import --connect jdbc:mysql://master:3306/sample --username root --password Password123$ --table student --num-mappers 1 --target-dir /user/test
(7)从数据库增量导入表数据到 HDFS 中
[hadoop@master ~]$mysql -u root -p
mysql>use sample;
mysql> insert into student values('04','sss');
mysql> insert into student values('05','ss2');
mysql> insert into student values('06','ss3');
#非数值型的值不能当做增量
mysql> alter table student modify column number int;
mysql> exit;
[hadoop@master ~]$sqoop import --connect jdbc:mysql://master:3306/sample --username root --password Password123$ --table student --num-mappers 1 --target-dir /user/test --check-column number -incremental append -last-value 0
查看导入数据
[hadoop@master ~]$hdfs dfs -cat /user/test/part-m-00000
21/04/19 13:57:06 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
1,zhangsan
2,lisi
3,wangwu
4,sss
5,ss2
6,ss3
如多次导入需先查看最新导入数据文件
[hadoop@master ~]$hdfs dfs -ls /user/test