• 【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
    
    • 1
    • 2

    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
    
    • 1
    • 2
    • 3

    让环境变量生效

    source /etc/profile
    
    • 1

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.Sqoop常用参数

    3.1.通用参数

    参数描述
    --connect 指定jdbc连接字符串
    --connect-manager 指定使用的连接管理类
    --driver 指定要使用的JDBC驱动类
    --hadoop-mapred-home 指定HADOOP_MAPRED_HOME路径
    --help帮助
    --username 设置认证用户名
    --password 设置认证密码
    --password-file指定存放密码信息文件的路径
    -P从控制台输入密码
    --connection-param-file 指定存储数据库连接参数的属性文件
    --table 指定表名称
    --direct使用直接导入导出模式(优化速度)
    -m,--num-mappers 使用n个map任务处理数据
    --fields-terminated-by 指定导入后文件的分割符(默认是 , )

    3.2.数据导入相关参数

    参数描述
    --append将数据追加到HDFS上已存在的数据集中
    --as-textfile将数据导入为普通文本文件(默认)
    --as-avrodatafile将数据导入Avro数据文件
    --as-sequencefile将数据导入SequenceFile
    --boundary-query 边界查询,用于创建分片
    –columns 从表中导出指定列数据
    --delete-target-dir如果指定目录存在,则先将其删除
    --direct-split0suze> 使用切分输入数据的大小
    --fatch-size 从数据库中批量读取记录数
    --inline-lob-limit 设置内联的LOB对象大小
    -e,--query 导入的查询语句
    --split-by 指定使用哪列去切分数据
    --target-dir 导入HDFS的目标路径
    --warehouse-dir HDFS存放表的根路径
    --where 指定导入时所使用的查询条件
    -z,–compress启用压缩
    --compression-codec 指定Hadoop的压缩方式(默认为Gzip)
    --null-string 使用指定字符串替换字符串值为null的列
    --null-non-string 使用指定字符串替换非字符串值为null的列

    3.3.数据导出相关参数

    参数描述
    --export-dir 导出过程中HDFS的源路径
    --call 导出数据调用指定存储过程名
    --input-null-string 使用指定字符串替换字符串值为null的列
    --input-null-non-string 使用指定字符串替换非字符串值为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');
    
    • 1
    • 2
    • 3
    • 4

    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    执行完可以看到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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 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));
    
    • 1

    使用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' 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    看到下面的表示任务已经成功处理完,使用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生态圈】其它文章如下,后续会继续更新

  • 相关阅读:
    前端枚举enum的应用(Element)封装
    解锁新技能《Redis ACL SETUSER命令》
    “语法糖”——我的编程新知
    【问题复盘】在Ubuntu 20.04下安装OFED驱动
    Android 音乐播放器悬浮窗
    【夜读】让自己更幸福的8件小事
    Codeforces Round #792 (Div. 1 + Div. 2)
    OpenCV之cv::undistort
    元素显示和背景调试
    10 款开源的在线游戏,点开就能玩的那种
  • 原文地址:https://blog.csdn.net/ming19951224/article/details/127586609