一、Sqoop简介
Sqoop是Hadoop和关系数据库服务器之间传送数据的一种工具。它是用来从关系数据库如:MySQL,Oracle到Hadoop的HDFS,并从Hadoop的文件系统导出数据到关系数据库。
传统的应用管理系统,也就是与关系型数据库的使用RDBMS应用程序的交互,是产生大数据的来源之一。这样大的数据,由关系数据库生成的,存储在关系数据库结构关系数据库服务器。
当大数据存储器和分析器,如MapReduce, Hive, HBase, Cassandra, Pig等,Hadoop的生态系统等应运而生图片,它们需要一个工具来用的导入和导出的大数据驻留在其中的关系型数据库服务器进行交互。在这里,Sqoop占据着Hadoop生态系统提供关系数据库服务器和Hadoop HDFS之间的可行的互动。
Sqoop:“SQL 到 Hadoop 和 Hadoop 到SQL”
Sqoop是Hadoop和关系数据库服务器之间传送数据的一种工具。它是用来从关系数据库如MySQL,Oracle到Hadoop的HDFS从Hadoop文件系统导出数据到关系数据库。它是由Apache软件基金会提供。
http://sqoop.apache.org/
二、下载安装
前置条件
安装JDK
安装Hadoop并配置历史服务下载
# 下载
root@master:~# wget https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
# 解压
root@master:~# tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local
三、配置
服务器您需要在集群中的单个节点上安装服务器。此节点将用作所有Sqoop客户端的入口点。
客户端客户端可以安装在任意数量的计算机上。
- 环境变量
# 配置环境变量
root@master:~# vi /etc/profile
# 内容
export SQOOP_HOME=/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0
export PATH=$PATH:$HIVE_HOME/bin:$SCALA_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$SQOOP_HOME/bin
# 立即生效
root@master:~# source /etc/profile
- Sqoop配置
修改sqoop-env.sh配置文件:
root@master:~# cp /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/conf/sqoop-env-template.sh /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/conf/sqoop-env.sh
root@master:~# vi /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/conf/sqoop-env.sh
# 内容
export HADOOP_COMMON_HOME=/usr/local/hadoop-2.9.2
export HADOOP_MAPRED_HOME=/usr/local/hadoop-2.9.2
# 设置hive主目录
export HIVE_HOME=/usr/local/apache-hive-2.3.6-bin
# 设置zookeeper主目录
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
# 设置zookeeper配置目录
export ZOOCFGDIR=/usr/local/zookeeper-3.4.14/conf
- 复制jar包
# 复制jar包到目录
root@master:~# cp /usr/local/apache-hive-2.3.6-bin/lib/mysql-connector-java-5.1.48.jar /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
- .验证是否安装成功
# 启动zookeeper(所有节点)
root@master:~# zkServer.sh start
root@slave1:~# zkServer.sh start
root@slave2:~# zkServer.sh start
# 启动hadoop
root@master:~# start-dfs.sh
root@master:~# sqoop version
/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/conf/sqoop-env.sh: line 36: export: `/usr/local/hadoop-2.9.2': not a valid identifier
/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/conf/sqoop-env.sh: line 37: export: `/usr/local/hadoop-2.9.2': not a valid identifier
/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/conf/sqoop-env.sh: line 39: export: `/usr/local/apache-hive-2.3.6-bin': not a valid identifier
Warning: /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
19/12/06 14:39:29 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
Sqoop 1.4.7
git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8
Compiled by maugli on Thu Dec 21 15:59:58 STD 2017
说明:
启动时sqoop时,必须先启动zookeeper与hadoop,因为配置里有这两个内容。
四、数据连接测试
- 创建Mysql数据库与表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `web_user `;
CREATE TABLE `web_user ` (
`id` bigint(255) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `web_user ` VALUES (1, 'admin');
SET FOREIGN_KEY_CHECKS = 1;
- sqoop测试与mysql操作
root@master:~# sqoop list-databases --connect jdbc:mysql://master:3306/ --username root --password 1234
Warning: /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
19/12/06 16:27:38 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
19/12/06 16:27:38 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
19/12/06 16:27:38 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
Fri Dec 06 16:27:39 CST 2019 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
sqoopdb
sys
五、 MySQL表导入HDFS:
- 导入
# 启动 Hadoop集群 :start-dfs.sh
# 导入指令
root@master:~# sqoop import --connect jdbc:mysql://master:3306/sqoopdb --username root --password 1234 --table user -m 1 --target-dir /sqoop/web_user --delete-target-dir
注意:
–delete-target-dir
是删除已存在目标文件夹,要清楚是否要删除该文件夹,避免数据丢失。
- sqoop增量MySql导入HDFS
# 数据库里执行
insert into web_user values(2,'adminstrator');
# 将HDFS数据导入到MySql
root@master:~# sqoop import --connect jdbc:mysql://master:3306/sqoopdb --username root --password 1234 --table user -m 1 --target-dir /sqoop/web_user --incremental append --check-column id
说明:
sqoop import:sqoop导入命令
--connect jdbc:mysql://master:3306/sqoopdb:连接mysql数据库表
--username root : 数据库账户名
--table emp : 数据库表
--m 1 : 开启map个数,即进程
--target-dir /queryresult : 导入目标地址(该目录下目标表不能存在)
--incremental append : 增量导入
--check-column id : 增量导入校验列
-last value 1205 : 从哪个值开始导入
--where “列名=’值’” : 条件
表名:请不要使用user
五、HDFS数据导出MySQL
# HDFS导出数据到MySql
root@master:~# sqoop export --connect jdbc:mysql://master:3306/sqoopdb --username root --password 1234 --table web_user -m 1 --export-dir /sqoop/user/part-m-00001
六、MySQ导入Hive
将hive的lib文件夹下的hive-exec-**.jar 放到sqoop的lib下:
指令:
root@master:~# cp /usr/local/apache-hive-2.3.6-bin/lib/hive-exec-2.3.6.jar /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/lib
执行:
# 将MySql数据导入到Hive
root@master:~# sqoop import --connect jdbc:mysql://master:3306/sqoopdb --username root --password 1234 --fields-terminated-by ',' --table web_user -m 1 --hive-import
参数说明:
--hive-home 重写$HIVE_HOME
--hive-import 插入数据到hive当中,使用hive的默认分隔符
--hive-overwrite 重写插入
--create-hive-table 建表,如果表已经存在,该操作会报错!
--hive-table [table] 设置到hive当中的表名
--hive-drop-import-delims 导入到hive时删除 \n, \r, and \01
--hive-delims-replacement 导入到hive时用自定义的字符替换掉
\n, \r, and \01
--hive-partition-key hive分区的key
--hive-partition-value hive分区的值
--map-column-hive 类型匹配,sql类型对应到hive类型
七、Hive导出MySQL
root@master:~# sqoop export --connect jdbc:mysql://master:3306/sqoopdb --username root --password 1234 --table web_user -m 1 --export-dir /user/hive/warehouse/web_user --input-fields-terminated-by ','
附:
import和export工具有些通用的选项:
选项 | 含义说明 |
---|---|
–connect | 指定JDBC连接字符串 |
–connection-manager | 指定要使用的连接管理器类 |
–driver | 指定要使用的JDBC驱动类 |
–hadoop-mapred-home | 指定$HADOOP_MAPRED_HOME路径 |
–help | 打印用法帮助信息 |
–password-file | 设置用于存放认证的密码信息文件的路 |
-P | 从控制台读取输入的密码 |
–password | 设置认证密码 |
–username | 设置认证用户名 |
–verbose | 打印详细的运行信息 |
–connection-param-file | 可选,指定存储数据库连接参数的属性文件 |
(HDFS)import工具的基本选项及其含义:
选项 | 含义说明 |
---|---|
–append | 将数据追加到HDFS上一个已存在的数据集上 |
–as-avrodatafile | 将数据导入到Avro数据文件 |
–as-sequencefile | $1 |
–as-textfile | 将数据导入到普通文本文件(默认) |
–boundary-query | 边界查询,用于创建分片(InputSplit) |
–columns |
从表中导出指定的一组列的数据 |
–delete-target-dir | 如果指定目录存在,则先删除掉 |
–direct | 使用直接导入模式(优化导入速度) |
–direct-split-size | 分割输入stream的字节大小(在直接导入模式下) |
–fetch-size | 从数据库中批量读取记录数 |
–inline-lob-limit | 设置内联的LOB对象的大小 |
-m,–num-mappers | 使用n个map任务并行导入数据 |
-e,–query | 导入的查询语句 |
–split-by |
指定按照哪个列去分割数据 |
–table | 导入的源表表名 |
–target-dir | 导入HDFS的目标路径 |
–warehouse-dir | HDFS存放表的根路径 |
–where | 指定导出时所使用的查询条件 |
-z,–compress | 启用压缩 |
–compression-codec | 指定Hadoop的codec方式(默认gzip) |
–null-string | 果指定列为字符串类型,使用指定字符串替换值为null的该类列的值 |
–null-non-string | 如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值 |
按条件导入:
--query select name from web_user where name='admin'
八、常见问题:
- Error: Could not find or load main class org.apache.sqoop.Sqoop