0


【Hadoop生态圈】10.使用Sqoop迁移MySQL数据到HDFS中

文章目录

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中
标签: hadoop hdfs mysql

本文转载自: https://blog.csdn.net/ming19951224/article/details/127586609
版权归原作者 皓亮君 所有, 如有侵权,请联系我们删除。

“【Hadoop生态圈】10.使用Sqoop迁移MySQL数据到HDFS中”的评论:

还没有评论