1.简介
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
要使用Sqoop需要JDK并且机器能正常操作Hadoop集群,因为Sqoop底层会将命令换为MapReduce代码,然后将其提交到Hadoop集群中去执行。
Sqoop目前有两个版本,完全不兼容。1.4.x为Sqoop1,1.99.x为Sqoop2,区别如下:
- Spoop1: Sqoop1只是一个客户端工具,负责将用户提交的命令转为MapReduce任务执行,从而实现关系型数据库何HDFS的相互导入/导出功能,相对Spoop2稳定性高,更轻量级。
- Sqoop2: 引入了服务端,对Connector实现了集中的管理,完善了权限机制,支持多种交互方式:命令行、Web UI和REST API。
此文以Sqoop1为介绍,Sqoop中两大核心模块如下,工作流程原理如下图
- 导入: 从关系型数据库将数据导入HDFS。
- 导出: 从HDFS中将数据导出到关系数据库中。
2.Sqoop环境配置
本文机器使用的JDK8环境,使用的Sqoop1.4.7版本,Hadoop3.2.4.环境已提前安装好。
下载地址: https://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
2.1.下载完然后上传到服务器 /home/soft/目录下解压
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
cd sqoop-1.4.7.bin__hadoop-2.6.0
2.2.配置Sqoop环境变量
vi /etc/profile
export SQOOP_HOME=/home/soft/sqoop-1.4.7.bin__hadoop-2.6.0
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SQOOP_HOME/bin
让环境变量生效
source /etc/profile
2.3.添加依赖包
- 1.由于使用Sqoop操作mysql数据库,所以需要把MySQLl驱动包添加到Sqoop的lib目录下。
- 2.需要在lib目录下添加commons-lang-2,6.jar包,不然会报下图错误
添加完如下图
2.4.开放MySQL的远程访问
如果测试的时候在一台机器上面请忽略下面
#赋远程访问权限
use mysql
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
#刷新权限
flush privileges;
3.Sqoop常用参数
3.1.通用参数
参数 | 描述 |
---|---|
--connect <jdbc-uri> | 指定jdbc连接字符串 |
--connect-manager <class-name> | 指定使用的连接管理类 |
--driver <class-name> | 指定要使用的JDBC驱动类 |
--hadoop-mapred-home <dir> | 指定HADOOP_MAPRED_HOME路径 |
--help | 帮助 |
--username <username> | 设置认证用户名 |
--password <password> | 设置认证密码 |
--password-file | 指定存放密码信息文件的路径 |
-P | 从控制台输入密码 |
--connection-param-file <filename> | 指定存储数据库连接参数的属性文件 |
--table <table-name> | 指定表名称 |
--direct | 使用直接导入导出模式(优化速度) |
-m,--num-mappers <n> | 使用n个map任务处理数据 |
--fields-terminated-by <split> | 指定导入后文件的分割符(默认是 , ) |
3.2.数据导入相关参数
参数 | 描述 |
---|---|
--append | 将数据追加到HDFS上已存在的数据集中 |
--as-textfile | 将数据导入为普通文本文件(默认) |
--as-avrodatafile | 将数据导入Avro数据文件 |
--as-sequencefile | 将数据导入SequenceFile |
--boundary-query | 边界查询,用于创建分片<InputSolit> |
–columns <col1,col2,…> | 从表中导出指定列数据 |
--delete-target-dir | 如果指定目录存在,则先将其删除 |
--direct-split0suze> <n> | 使用切分输入数据的大小 |
--fatch-size <n> | 从数据库中批量读取记录数 |
--inline-lob-limit <n> | 设置内联的LOB对象大小 |
-e,--query <sql> | 导入的查询语句 |
--split-by <cloumn-name> | 指定使用哪列去切分数据 |
--target-dir <dir> | 导入HDFS的目标路径 |
--warehouse-dir <dir> | HDFS存放表的根路径 |
--where <clasuse> | 指定导入时所使用的查询条件 |
-z,–compress | 启用压缩 |
--compression-codec <c> | 指定Hadoop的压缩方式(默认为Gzip) |
--null-string <str> | 使用指定字符串替换字符串值为null的列 |
--null-non-string <str> | 使用指定字符串替换非字符串值为null的列 |
3.3.数据导出相关参数
参数 | 描述 |
---|---|
--export-dir <dir> | 导出过程中HDFS的源路径 |
--call <stored-proc-name> | 导出数据调用指定存储过程名 |
--input-null-string <str> | 使用指定字符串替换字符串值为null的列 |
--input-null-non-string <str> | 使用指定字符串替换非字符串值为null的列 |
--staging-table \n | 在数据导出到数据库前之前,数据临时存放的表名称 |
--clear-staging-table | 清除工作区中临时存放的数据 |
--batch | 使用批量模式导出 |
4.测试
4.1.导入表数据到HDFS
数据导入分为全表导入和条件导入。
在mysql数据库中添加测试用的数据
create database sqoop;
use sqoop;
create table user(id int(10) primary key,name varchar(32));
insert into user values(1,'test'),(2,'admin'),(3,'superadmin');
4.1.1.使用Sqoop将user表所有数据导入HDFS中
bin/sqoop import \
--connect jdbc:mysql://192.168.239.128:3306/sqoop \
--username root \
--password 123456 \
--table user \
--target-dir /user1 \
--delete-target-dir \
--fields-terminated-by '\t'
执行完可以看到HDFS中已经有user1这个目录,并且能看到_SUCCESS成功标识文件
4.1.2.使用Sqoop将user表符合条件指定列的数据导入HDFS中
bin/sqoop import \
--connect jdbc:mysql://192.168.239.128:3306/sqoop \
--username root \
--password 123456 \
--target-dir /user2 \
--delete-target-dir \
--fields-terminated-by '\t' \
--query 'select id,name from user where id>1 and $CONDITIONS' \
--split-by id
- 1.在使用–query指定SQL语句的时,其中必须包含$CONDITIONS
- 2.--query和--table不能同时使用
- 3.使用–query需要使用–split-by指定哪列进行任务拆分或使用–num-mappers 1让Map任务只有1个
4.2.导出表数据到mysql中
创建一个表结构和user一样的新表
create table export_user(id int(10) primary key,name varchar(32));
使用Sqoop将HDFS中的user表数据导出到MySQL中的export_user表中
bin/sqoop export \
--connect jdbc:mysql://192.168.239.128:3306/sqoop \
--username root \
--password 123456 \
--export-dir /user1 \
--table export_user \
--fields-terminated-by '\t'
看到下面的表示任务已经成功处理完,使用mysql客户端工具查看表数据可以看到重HDFS导出的数据。
5.DataX迁移工具
DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
DataX githun地址: https://github.com/alibaba/DataX
DataX 详细介绍: https://github.com/alibaba/DataX/blob/master/introduction.md
【Hadoop生态圈】其它文章如下,后续会继续更新。