文章目录

  • Hadoop系列文章
  • Sqoop简介
  • Sqoop架构
    • Sqoop数据导入
    • Sqoop数据导出
  • Sqoop安装部署
    • 版本介绍
    • 前提环境
    • 下载
    • 安装配置
  • Sqoop的使用
    • 构建测试数据
    • 将MySql数据导入HDFS
      • 全表导入
      • 部分数据导入
        • where过滤
        • query查询
    • 从HDFS导出到MySql
      • 创建目标表
      • 执行导入脚本
      • 执行脚本
      • 查看执行结果
    • 将数据导入Hive
      • 创建Hive表
      • 执行导入脚本
      • 查看结果

Hadoop系列文章

Hadoop系列 (一):在CentOS中搭建hadoop环境(伪分布式)

Hadoop系列 (二):完全分布式搭建(腾讯云服务器+阿里云服务器)

Hadoop系列 (三):HDFS详细介绍

Hadoop系列 (四):Yarn详细介绍

Hadoop系列 (五):MapReduce详细介绍

Hadoop系列 (六):Spark搭建

Hadoop系列 (七):ZooKeeper详细介绍

Hadoop系列 (八):Hbase搭建

Hadoop系列 (九):Sqoop详细介绍

Hadoop系列 (十):Flume详细介绍

Sqoop简介

Sqoop全称是 Apache Sqoop,是一个开源工具,能够将数据从数据存储空间(数据仓库,系统文档存储空间,关系型数据库)导入 Hadoop 的 HDFS列式数据库HBase,供 MapReduce 分析数据使用。

​ 数据传输的过程大部分是通过 MapReduce 过程来实现,只需要依赖数据库的Schema信息。Sqoop所执行的操作是并行的,数据传输性能高,具备较好的容错性,并且能够自动转换数据类型。

Sqoop是一个为高效传输海量数据而设计的工具,一般用在从关系型数据库同步数据到非关系型数据库中

Sqoop专门是为大数据集设计的。Sqoop支持增量更新,将新记录添加到最近一次的导出的数据源上,或者指定上次修改的时间戳。

Sqoop架构

Sqoop架构主要有三部分组成:Sqoop客户端,数据存储与挖掘、数据存储空间。

其中数据存储与挖掘主要为HDFS、Hbase、Hive等工具。

从图中可以看出:

  1. Sqoop通过Hadoop中的Map任务将数据从数据存储空间中导入HDFS供数据分析使用
  2. Sqoopzhi负责数据传输,不负责数据分析,只涉及Map任务,不涉及Reduce任务。
  3. Sqoop本质是运行一个mapreduce程序,所以要运行sqoop,先启动Hadoop。

Sqoop数据导入

sqoop数据导入大致流程如下:

  1. Sqoop通过JDBC读取数据元数据信息,例如表列名,数据类型等。
  2. Sqoop获取元数据信息,并生成以一个与表名相同的容器类。
  3. Sqoop生成的容器类完成数据的序列化和反序列化,保存表的每一行数据。
  4. Sqoop生成的记录容器类向Hadoop的Map作业提供序列化和反序列化的功能,然后sqoop启动Map作业。
  5. 在Sqoop启动Map作业过程中,Map利用Sqoop生成的记录容器类提供的反序列化功能,通过JDBC读取数据库中的内容。
  6. Map作业将读取的数据写入HDFS,此时Sqoop生成的记录容器类提供序列化功能。

Sqoop数据导出

Sqoop数据导出过程:将通过MapReduce或Hive分析后得出的数据结果导出到关系型数据库,供其他业务查看或生成报表使用

Sqoop export 是将一组文件从HDFS导出回RDBMS的工具。 前提条件是,在数据库中,目标表必须已经存在。 根据用户指定的分隔符将输入文件读取并解析为一组记录。

此过程与Sqoop数据导入类似,只是在导出数据之前,需要在RDBMS中建立目标表,Sqoop读取该表的元数据信息,为Map作业读取HDFS数据提供序列化及反序列化的功能,最后通过一批INSERT语句写入目标数据库中。

Sqoop安装部署

版本介绍

官网地址:https://sqoop.apache.org/

sqoop和sqoop2,但是后sqoop2还不稳定,不稳定,所以不要用于生产,二者之间主要有以下异同:

  1. 两个不同的版本,完全不兼容
  2. 版本号划分区别,Apache版本:1.4.x(Sqoop1); 1.99.x(Sqoop2) CDH版本 : Sqoop-1.4.3-cdh4(Sqoop1) ; Sqoop2-1.99.2-cdh4.5.0 (Sqoop2)。
  3. 相对于Sqoop1来说,Sqoop2引入了Sqoop server,集中化管理connector等。
  4. Sqoop2提供了多种访问方式:CLI,Web UI,REST API。
  5. Sqoop引入了基于角色的安全机制。

由于我之前的Hadoop一系列组件都是采用的Apache版本,下面会使用Apache Sqoop进行安装部署。

前提环境

  • Hadoop

  • 关系型数据库(MySQL/Oracle)

  • HBase

  • Hive

  • ZooKeeper

下载

使用Sqoop1最新版本:

[hadoop@master software]$ wget https://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

安装配置

将Sqoop解压到指定目录/opt/sqoop

# 创建sqoop文件夹并修改权限
[hadoop@master software]$ cd /opt
[hadoop@master opt]$ mkdir sqoop
[hadoop@master opt]$ sudo mkdir sqoop
[hadoop@master opt]$ sudo chown -R hadoop:hadoop sqoop#解压
[hadoop@master software]$ tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt/sqoop/ --strip-components 1

安装在/opt文件夹是个人习惯,大家可以发现,我几乎所有程序都放在这个文件夹里,可以根据个人习惯进行调整。

linux各个文件夹大概可以理解为:

/usr:系统级的目录,可以理解为C:/Windows//usr/lib理解为C:/Windows/System32
/usr/local:用户级的程序目录,可以理解为C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。
/opt:用户级的程序目录,可以理解为D:/Software,opt有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接rm -rf掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用。
/usr/src:系统级的源码目录。
/usr/local/src:用户级的源码目录。

安装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面,很方便进行管理。

修改Sqoop环境变量

编辑文件.bash_profile,在文件末尾添加下面内容:

#set Sqoop env
export SQOOP_HOME=/opt/sqoop
export PATH=$PATH:$SQOOP_HOME/bin

使.bash_profile文件生效:

[hadoop@master ~]$ source .bash_profile
[hadoop@master ~]$ echo $SQOOP_HOME
/opt/sqoop
[hadoop@master ~]$ sqoop version
Warning: /opt/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /opt/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
2021-10-26 10:54:37,890 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
[hadoop@master ~]$

修改Sqoop配置文

/opt/sqoop/conf目录下

[hadoop@master ~]$ cd /opt/sqoop/conf
[hadoop@master conf]$ cp sqoop-env-template.sh sqoop-env.sh
[hadoop@master conf]$ vim sqoop-env.sh

sqoop-env.sh中添加以下内容:

修改/sqoop/bin/configure-sqoop文件

由于集群中没有配置hcatalogaccumlo因此应该在sqoop的配置文件中注释掉判断hcatalogaccumlo路径是否正确的代码:

关联Hive

[hadoop@master conf]$ cp /opt/hive/conf/hive-site.xml ./
[hadoop@master conf]$ ll
total 36
-rw-r--r-- 1 hadoop hadoop 3569 Oct 26 10:41 hive-site.xml
-rw-rw-r-- 1 hadoop hadoop 3895 Dec 19  2017 oraoop-site-template.xml
-rwxr-xr-x 1 hadoop hadoop 1395 Oct 26 10:39 sqoop-env.sh
-rw-rw-r-- 1 hadoop hadoop 1404 Dec 19  2017 sqoop-env-template.cmd
-rwxr-xr-x 1 hadoop hadoop 1345 Dec 19  2017 sqoop-env-template.sh
-rw-rw-r-- 1 hadoop hadoop 6044 Dec 19  2017 sqoop-site-template.xml
-rw-rw-r-- 1 hadoop hadoop 6044 Dec 19  2017 sqoop-site.xml

添加Mysql驱动

[hadoop@master ~]$ cp /opt/hive/lib/mysql-connector-java-5.1.49.jar /opt/sqoop/lib/
[hadoop@master ~]$

注意,不要使用最新版本的mysql-connector-java-8.xxx.jar,不然会有以下信息返回

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

添加MysqlDump应用程序

数据传输需要用的mysqldump程序,这样可以加快数据传输。可以从mysql安装包中导入。

[hadoop@master bin]$ pwd
/home/hadoop/software/mysql-8.0.26-linux-glibc2.12-x86_64/bin

或者从安装mysql服务器的节点中导入。由于我用的是阿里云数据库服务器,而且之前单独部署过mysql服务器,所以直接从安装包中复制到/usr/bin目录中:

[hadoop@master bin]$ sudo cp mysqldump /usr/bin

同样复制到slave1等其他节点:

[hadoop@master bin]$ scp mysqldump hadoop@slave1:/usr/bin/

添加commons-lang-2.6.jar

/opt/sqoop/lib下有commons-lang3-3.4.jar的包,但是直接使用,在连接mysql时会报错:

[hadoop@master software]$ wget https://commons.apache.org/proper/commons-lang/download_lang.cgi/commons-lang-2.6-bin.tar.gz#解压并移动到lib下
[hadoop@master commons-lang-2.6]$ cp commons-lang-2.6.jar /opt/sqoop/lib/

测试

执行测试代码

[hadoop@master]$ sqoop list-databases --connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/ --username hive --P

Sqoop的使用

构建测试数据

在mysql中创建一张表,并插入数据

CREATE TABLE bg_data.students (id tinyint(4) NOT NULL AUTO_INCREMENT,account varchar(255) DEFAULT NULL,passwd varchar(255) DEFAULT NULL,PRIMARY KEY (id));INSERT INTO students VALUES ('1', 'admin', 'admin'),('2', 'ericray', '12345'),('3', 'system', 'system');

将MySql数据导入HDFS

全表导入

创建hdfs存放文件目录

导入脚本:

[hadoop@master]$ sqoop import \
--connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \
--username hive \
--password xxxx \
--table students \
--num-mappers 1 \
--target-dir /user/hadoop/sqoop/import/imp_students \
--delete-target-dir \
--direct \
--fields-terminated-by "\t"

参数解释:

--delete-target-dir :目标目录存在就删除--target-dir:指定输出目录,不指定就直接在主目录下生产。--num-mappers 1:设置map的个数--direct:manager.DirectMySQLManager: Beginning mysqldump fast path import.使用这个命令会很快,本机装有mysql时,才可以使用。--fields-terminated-by "\t":设置输出文件分分割方式--as-parquetfile :设置文件格式为parquetfile--split-by id :通常配合-m 参数使用。用于指定根据哪个字段进行划分并启动多少个maptask。--columns <col,col,col...> :指定表中部分字段进行导入--query:直接查询--where <where clause> :条件查询

关于split-by

split-by 根据不同的参数类型有不同的切分方法:

  1. split-by 根据不同的参数类型有不同的切分方法,如 int 型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来 确定划分几个区域。比如 select max(split_by),min(split-by) from 得到的 max(split-by)和min(split-by) 分别为1000和1,而num-mappers(-m)为2的话,则会分成两个区域 (1,500)和(501-1000),同时也会分成2个sql给2个map去进行导入操作,最后每个map各自获取各自SQL中的数据进行导入工作.
  2. split-by即便是int型,若不是连续有规律递增的话,各个map分配的数据是不均衡的,可能会有些map很忙,有些map几乎没有数据处理的情况,就容易出现数据倾斜,所以一般split by的值为自增主键id

执行过程:

查看导入的数据

[hadoop@master ~]$ hdfs dfs -ls /user/hadoop/sqoop/import/imp_students

[hadoop@master ~]$ hdfs dfs -cat /user/hadoop/sqoop/import/imp_students/part-m-00000

看这个数据,是不是很奇怪,改成指定字段试试

sqoop import \
--connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \
--username hive \
--password xxxx \
--table students \
--columns 'id,account,passwd' \
--num-mappers 1 \
--target-dir /user/hadoop/sqoop/import/imp_students \
--delete-target-dir \
--direct \
--fields-terminated-by "\t"

查看结果,由于不停测试,个人服务器性能太差,所以减少了数据量。

数据看起来是对的。

至于为什么会这样,目前没有找到答案,如果你知道原因,请在下方评论区留言。谢谢!

部分数据导入

很多时候,我们需要对数据进行过滤处理,导入的是原始数据的一个子数据集,这里提供2种方式。

where过滤

脚本如下:

[hadoop@master ~]$ sqoop import \
--connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \
--username hive \
--password xxxx \
--table students \
--columns 'id,account,passwd' \
--where "account = 'ericray'" \
--num-mappers 1 \
--target-dir /user/hadoop/sqoop/import/imp_students_1 \
--delete-target-dir \
--direct \
--fields-terminated-by "\t"

查看结果

query查询

需要注意:使用query sql语句来进行查找不能加参数--table ;并且必须要添加where条件;where条件后面必须带一个$CONDITIONS这个字符串;且这个sql语句必须用单引号不能用双引号

查询脚本如下:

[hadoop@master ~]$ sqoop import \
--connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \
--username hive \
--password xxxx \
--query 'select id,account,passwd from students where id < 3 and $CONDITIONS' \
--num-mappers 1 \
--target-dir /user/hadoop/sqoop/import/imp_students_2 \
--delete-target-dir \
--direct \
--fields-terminated-by "\t"

查看结果

从HDFS导出到MySql

创建目标表

在mysql中创建目标表:

create table bg_data.my_stu like bg_data.students

执行导入脚本

脚本如下:

sqoop export \
--connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \
--username hive \
--password Ppnn2021 \
--table my_stu \
--columns 'id,account,passwd' \
--export-dir /user/hadoop/sqoop/import/imp_students_3 \
--fields-terminated-by "\t" \
--num-mappers 1

执行脚本

查看执行结果

将数据导入Hive

导入数据到hive中的工作机制,是通过mapreduce把关系型数据库的数据导入到hdfs中去,然后创建hive表,然后通过load data加载数据到hive表中。

创建Hive表

启动hive

在hive中创建表h_students,脚本如下:

drop table if exists myhive.h_students ;
create table myhive.h_students(
id int,
account string,
password string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;

也可以通过--create-hive-table参数自动创建表

执行上面脚本

执行导入脚本

脚本如下:

[hadoop@master ~]$ sqoop import \
--connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \
--username hive \
--password xxxx \
--table students \
--columns 'id,account,passwd' \
--num-mappers 1 \
--target-dir /user/hadoop/sqoop/import/imp_students_4 \
--delete-target-dir \
--direct \
--fields-terminated-by "\t" \
--hive-database myhive \
--hive-import \
--hive-table h_students

执行上面脚本

查看结果

Hadoop系列 (九):Sqoop详细介绍相关推荐

  1. Kafka系列之:详细介绍部署Kafka Connect分布式集群

    Kafka系列之:详细介绍部署Kafka Connect分布式集群 一.部署分布式Kafka集群详细步骤 二.Kafka Worker节点安装部署Kafka 三.修改connect-distribut ...

  2. 大数据开发之Sqoop详细介绍

    备注: 测试环境 CDH 6.3.1 Sqoop 1.4.7 文章目录 一.Sqoop概述 二.Sqoop 工具概述 三.Sqoon工具详解 3.1 codegen 3.2 create-hive-t ...

  3. angular 系列八 ui-router详细介绍及ngRoute工具区别

    我们了解 angular.js 是一种富客户端单页面应用,所以要在一个页面呈现不同的视图,路由起到了至关重要的作用. angular.js 为我们封装好了一个路由工具 ngRoute ,它是一种靠ur ...

  4. Hadoop集群的详细介绍

    入门笔记,如有错误还请大家指证 Hadoop集群 一.认识Hadoop集群 二.HDFS (一).什么是HDFS (二).HDFS的组件 (三).HDFS的作用 (四).HDFS常用命令 (五).HD ...

  5. Hadoop系列 (六):Spark搭建

    文章目录 Hadoop系列文章 Spark简介 Spark搭建 Scala安装 Spark安装 Spark启动 Spark界面 Spark简单使用 Spark Shell PySpark Shell ...

  6. 详细介绍百度ERNIE 2.0:A Continual Pre-Training Framework for Language Understanding

    系列阅读: 详细介绍百度ERNIE1.0:Enhanced Representation through Knowledge Integration 详细介绍百度ERNIE 2.0:A Continu ...

  7. 详细介绍ERNIE 3.0: Large-scale Knowledge Enhanced Pre-training for Language Understanding and Generation

    系列阅读: 详细介绍百度ERNIE1.0:Enhanced Representation through Knowledge Integration 详细介绍百度ERNIE 2.0:A Continu ...

  8. 详细介绍如何从零开始制作51单片机控制的智能小车(二)———超声波模块、漫反射光电管、4路红外传感器的介绍和使用

       我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,在本系列的上一篇文章中介绍了如何让小车动起来,本文作为本系列的第二篇文章,主要介绍让小车实现自动避障所涉及的一些传感器, ...

  9. 吃透Redis系列(九):Redis代理twemproxy和predixy详细介绍

    Redis系列文章: 吃透Redis系列(一):Linux下Redis安装 吃透Redis系列(二):Redis六大数据类型详细用法 吃透Redis系列(三):Redis管道,发布/订阅,事物,过期时 ...

最新文章

  1. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
  2. egg前面加什么_跟 egg 有关的英语多半是贬义,goose egg 也八九不离十
  3. SpringBoot自定义转换器(Convert)
  4. 面向对象编程02—装饰器、类方法、静态方、访问控制
  5. mysql测试工作中的应用_Mysql精华总结,解决测试人员面试中的碰到的一切Mysql问题(一)...
  6. 307 跳转会携带请求方法吗_面试官:GET和POST两种基本请求方法有什么区别
  7. linux安装php5.5 mysql_MySQL 在Linux上的安装 (RedHat 5.5)
  8. 荣耀play4t pro、荣耀x10、华为nova6,哪一个更值得买?
  9. 使用Emacs执行外部shell命令
  10. 指利用计算机技术实现对文本篇章的理解,行业发展|人工智能的自然语言处理技术已经到了这一步...
  11. 推荐四格漫画:勇者、魔族、龙族
  12. 关于读研和生信学科的思考
  13. 我的世界java版种子多村庄_《我的世界》“村庄与掠夺”PE版种子推荐,出生点就7个村庄相连...
  14. 2016年 最火的 15 款 HTML5 游戏引擎
  15. 声卡接口 LINE_IN、MIC_IN、LINE_OUT
  16. 小程序使用绑定手机号码接口显示失败
  17. matlab 变速不变调,使用GoldWave 轻松实现变速不变调
  18. mybatis resulttype
  19. Windows的sc命令详解
  20. 第二周 Linux文件管理类命令及bash基本特性

热门文章

  1. saucenao和trace.moe api的使用
  2. BLE蓝牙虚拟车钥匙介绍
  3. html - 1.开发工具
  4. LIRE Documentation详解
  5. 计算机网络-传输层(UDP协议报文格式,伪首部,UDP校验过程)
  6. 雅思备考Road to IELTS
  7. easyexcel读取excel合并单元格数据
  8. 计算机错误1053,win10系统电脑宽带连接错误1053的修复方法
  9. Jscript setTimeOut用法
  10. 2BizBox 中国财务注意事项(自动审批人的设置)