• Sqoop学习详细介绍!!


    一、Sqoop介绍

    Sqoop是一款开源的工具,主要用于在Hadoop(HDFS/Hive/HBase)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

    Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。

    二、安装

    1. 1).解压
    2. tar -zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/installs
    3. 2).重命名
    4. mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop1.4.6
    5. 3).修改配置文件
    6. cd /opt/installs/sqoop1.4.6/conf
    7. mv sqoop-env-template.sh sqoop-env.sh
    8. vi sqoop-env.sh
    9. #增加配置,注意修改路径
    10. export HADOOP_COMMON_HOME=/opt/installs/hadoop3.1.4
    11. export HADOOP_MAPRED_HOME=/opt/installs/hadoop3.1.4
    12. export ZOOCFGDIR=/opt/installs/zookeeper3.4.6
    13. export HIVE_HOME=/opt/installs/hive3.1.2
    14. 4).将mysql的驱动jar复制到sqoop的lib目录下 (底层需要用JDBC操作MySQL数据库)
    15. cp /opt/installs/hive3.1.2/lib/mysql-connector-java-8.0.26.jar /opt/installs/sqoop1.4.6/lib/
    16. 5).配置sqoop环境变量
    17. export PATH=$PATH:/opt/installs/sqoop1.4.6/bin

    三、sqoop-import

    在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。

    1. -- 测试数据库的表是否可以连接,显示库中的所有表
    2. sqoop list-tables --connect jdbc:mysql://hadoop10:3306/test1 --username root --password 123456

    1). RDBMS(mysql) -> HDFS

    1. sqoop import \
    2. --driver com.mysql.jdbc.Driver \
    3. --connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
    4. --username root \
    5. --password 123456 \
    6. --table t_sex \
    7. --num-mappers 4 \
    8. --fields-terminated-by '\t' \
    9. --target-dir /mysql/t_user \
    10. --delete-target-dir

    参数                                  作业
    --driver                        mysql驱动
    --connect                    数据库连接url  jdbc:mysql://ip:3306/数据库
    --username                 连接mysql数据库用户名
    --password                 连接mysql数据库密码
    --table                         mysql中test1数据库中表名
    --num-mappers           sqoop底层是mapreduce, 指定启动的maptask个数,海量数据可以并                                    行抽取
                                      解释:sqoop抽取任务会转换成mr作业,该mr作业由于不需要对数据进行聚合,所有只需要保留maptask阶段,没有reduceTasksqoop,需要依赖hadoop的HDFS和Yarn
    --fields-terminated-by    数据写入HDFS存储到文件中,列与列之间的分隔符
    --target-dir                     存储到HDFS的目标路径,配置的是目录,并且该目录应该不存在
    --delete-target-dir          如果存在,则提前删除 

     mysql中的表:

    运行1:

     查看:

    yarn:

    hdfs:


    运行2: 

    1. sqoop import \
    2. --driver com.mysql.cj.jdbc.Driver \
    3. --connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
    4. --username root \
    5. --password 123456 \
    6. --table t_sex \
    7. --columns "id,name" \
    8. --where "id > 2" \
    9. --target-dir /mysql/t_user \
    10. --delete-target-dir \
    11. --num-mappers 1 \
    12. --fields-terminated-by ','

    参数
    --columns     指定列名
    --where       指定查询条件

    查看hdfs:


    运行3:

     

    1. sqoop import \
    2. --driver com.mysql.cj.jdbc.Driver \
    3. --connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
    4. --username root \
    5. --password 123456 \
    6. --num-mappers 2 \
    7. --split-by id \
    8. --fields-terminated-by '\t' \
    9. --query 'select id, name,sex from t_sex where $CONDITIONS and id > 2' \
    10. --target-dir /mysql/t_user \
    11. --delete-target-dir

    参数             作用
    --split-by      根据指定字段进行拆分,相当于datax的splitPK。根据这一列的值把数据分成几部分
    --num-mappers   指定并行度,简写-m 
    --query         查询语句。$CONDITIONS相当于占位符,写where条件必须有写这个

    查看hdfs:

     

     2). RDBMS -> Hive

    运行:

    1. sqoop import \
    2. --driver com.mysql.cj.jdbc.Driver \
    3. --connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
    4. --username root \
    5. --password 123456 \
    6. --table t_sex \
    7. --num-mappers 1 \
    8. --hive-import \
    9. --fields-terminated-by "," \
    10. --hive-overwrite \
    11. --hive-database test_hive \
    12. --hive-table hive_user

     --hive-import              代表将数据导入hive
    --fields-terminated-by   导入hive后,存储在HDFS上文件的分隔符
    --hive-database          hive的数据库
    --hive-table             上边指定库下的表,可以不存在,会自动创建
    --hive-overwrite         将表中数据覆盖

    查看hive:

     四、sqoop-export

    在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS关系型数据库)中传输数据,叫做:导出,即使用export关键字。

    1). HDFS|hive -> RDBMS

    ① 准备数据,上传hdfs的sqoop目录下

    1. vi a.txt
    2. # 在文件中添加如下内容
    3. 1 zhangsan true 20 2020-01-11
    4. 2 lisi false 25 2020-01-10
    5. 3 wangwu true 36 2020-01-17
    6. 4 zhaoliu false 50 1990-02-08
    7. 5 win7 true 20 1991-02-08
    8. #在hdfs上创建sqoop目录(目录名称随意,不过需要和后边对应),将文件上传到sqoop目录下
    9. hdfs dfs -mkdir /sqoop
    10. hdfs dfs -put a.txt /sqoop

    ② 在mysql中创建表

    注意:导出并不会自动创建对应的表,需要提前自己创建
    1. create table t_user2(
    2. id int primary key auto_increment,
    3. name VARCHAR(32),
    4. sex boolean,
    5. age int,
    6. birthDay date
    7. ) CHARACTER SET=utf8;

     ③ 将hdfs上的数据导入mysql表中

    1. sqoop export \
    2. --connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
    3. --username root \
    4. --password 123456 \
    5. --export-dir /sqoop \
    6. --input-fields-terminated-by ' ' \
    7. --columns "id,name,sex,age,birthDay" \
    8. --table t_user2 \
    9. --update-key id \
    10. --update-mode allowinsert

    --export-dir   指定导出数据的目录
    --table        mysql中的表名
    --columns      字段名
    --update-mode  如果是allowinsert,则允许不但能够导入新数据的时候,还可以更新之前的数据
                   如果是updateonly,则只会更新以前的数据,不添加新数据
    --update-key   如果指定列的值已经存在,则会触发修改操作,否则添加,一般指定主键列

    查看mysql:

     五、sqoop应用问题汇总

    1.sqoop在导入或者导出的时候,空值问题处理。

    1. 注意:不用直接通过工具界面修改表中的数据,制造空数据,需要重新添加一条
    2. Hive 中的 Null 在底层是以“\N”来存储,而 MySQL 中的 Null 在底层就是 Null,为了保证数据两端的一致性。
    3. 导入数据时采用--null-string 和--null-non-string
    4. 导出数据时采用--input-null-string 和--input-null-non-string 两个参数。
    5. --null-string含义是 string类型的字段,当Value是NULL,替换成指定的字符
    6. --null-string '\\N' 替换为 \N

    导入(mysql-->hive):

    1. sqoop import \
    2. --driver com.mysql.cj.jdbc.Driver \
    3. --connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
    4. --username root \
    5. --password 123456 \
    6. --table t_user \
    7. --num-mappers 1 \
    8. --hive-import \
    9. --fields-terminated-by "," \
    10. --hive-overwrite \
    11. --hive-database test_hive \
    12. --hive-table hive_user \
    13. --null-non-string '\\N' \
    14. --null-string '\\N'

    mysql表中有空数据: 

     查看hive表:

     

     

     导出(hive-->mysql):

    1. sqoop export \
    2. --connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
    3. --username root \
    4. --password 123456 \
    5. --export-dir /user/hive/warehouse/test_hive.db/dept \
    6. --input-fields-terminated-by '\t' \
    7. --columns "deptno,dname,loc" \
    8. --table dept \
    9. --update-key deptno \
    10. --update-mode allowinsert \
    11. --input-null-non-string '\\N' \
    12. --input-null-string '\\N'

    在hive表中插入空值数据:

     在mysql查看表:

    2.将mysql数据导入到hive分区表中

    1. sqoop import \
    2. --driver com.mysql.cj.jdbc.Driver \
    3. --connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
    4. --username root \
    5. --password 123456 \
    6. --table t_person2 \
    7. --num-mappers 1 \
    8. --hive-import \
    9. --fields-terminated-by "," \
    10. --hive-overwrite \
    11. --hive-database test_hive \
    12. --hive-table t_person2 \
    13. --null-non-string '\\N' \
    14. --null-string '\\N' \
    15. --hive-partition-key dt \
    16. --hive-partition-value 20231220

     查看mysql表:

    查看hive表:

     3.将hive分区表导出到mysql

    在mysql建表:

     

    1. sqoop export \
    2. --connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
    3. --username root \
    4. --password 123456 \
    5. --export-dir /user/hive/warehouse/test_hive.db/t_person2/dt=20231220 \
    6. --input-fields-terminated-by ',' \
    7. --table t_person2 \
    8. --update-key dt \
    9. --update-mode allowinsert \
    10. --input-null-non-string '\\N' \
    11. --input-null-string '\\N'

    查看表:

     

  • 相关阅读:
    【2023,学点儿新Java-13】阶段练习之Java面试企业真题(阿里巴巴&拼多多 等) | 常用的Java命令行操作都有哪些 | 如何解决Java的内存泄漏和内存溢出问题?
    shell:远程机器执行当前机器的脚本
    【源码】2024心悦搜剧源码百万级网盘资源
    Java的ArrayList集合存储基本数据
    计算机毕业设计springboot奖助学金管理系统q0326源码+系统+程序+lw文档+部署
    基础篇-SpringBoot HTTP接口实战
    [其他] ubuntu 22 上编译 ffmpeg
    猿创征文 | 五分钟让你了解vue表单
    Django思维导图-路由
    Python面试必备一之迭代器、生成器、浅拷贝、深拷贝
  • 原文地址:https://blog.csdn.net/m0_46331650/article/details/139655170