文章目录
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
exportSQOOP_HOME=/home/soft/sqoop-1.4.7.bin__hadoop-2.6.0
exportPATH=$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生态圈】其它文章如下,后续会继续更新。
- 1.Hadoop入门教程及集群环境搭建
- 2.使用Flume采集日志数据到HDFS中
- 3.Zookeeper入门教程及集群环境搭建
- 4.Kafka入门教程及集群环境搭建
- 5.HBase列存储数据库入门教程及集群环境搭建
- 6.MapReduce离线计算引擎入门教程
- 7.离线OLAP引擎Hive入门教程
- 8.Flink实时计算引擎入门教程
- 9.使用Maxwell实时采集MySQL数据到Kafka中
- 10.使用Sqoop迁移MySQL数据到HDFS中
版权归原作者 皓亮君 所有, 如有侵权,请联系我们删除。