【数据采集工具】Sqoop从入门到面试学习总结

国科大学习生活(期末复习资料、课程大作业解析、大厂实习经验心得等): 文章专栏(点击跳转)

大数据开发学习文档(分布式文件系统的实现,大数据生态圈学习文档等): 文章专栏(点击跳转)

【数据采集工具】Sqoop从入门到面试学习总结

  • 一、什么是Sqoop?
    • [1.1 Sqoop简介](#1.1 Sqoop简介)
    • [1.2 Sqoop的主要特点](#1.2 Sqoop的主要特点)
    • [1.3 Sqoop的基本命令格式](#1.3 Sqoop的基本命令格式)
  • 二、Sqoop的简单使用案例
    • [2.1 导入数据](#2.1 导入数据)
      • [2.1.1 RDBMS 到 HDFS](#2.1.1 RDBMS 到 HDFS)
      • [2.1.2 RDBMS 到 Hive](#2.1.2 RDBMS 到 Hive)
      • [2.1.3 RDBMS 到 Hbase](#2.1.3 RDBMS 到 Hbase)
    • [2.2 导出数据](#2.2 导出数据)
      • [2.2.1 Hive/HDFS到RDBMS](#2.2.1 Hive/HDFS到RDBMS)
  • 三、脚本打包
  • 四、Sqoop一些常用命令及参数
    • [4.1 导入数据命令选项](#4.1 导入数据命令选项)
    • [4.2 导出数据命令选项](#4.2 导出数据命令选项)
    • [4.3 通用命令选项](#4.3 通用命令选项)
  • 参考文献

一、什么是Sqoop?

1.1 Sqoop简介

Apache Sqoop(SQL-to-Hadoop Optimized Import/Export)是一个用于在关系型数据库管理系统(RDBMS)和Apache Hadoop之间的数据传输的工具。它旨在使大量数据的导入导出操作变得简单和高效。

Sqoop原理架构图

1.2 Sqoop的主要特点

  1. 批量数据传输 :Sqoop可以高效地将大量数据从关系型数据库批量 导入到Hadoop的HDFS中,或者将数据从HDFS批量导出到关系型数据库。

  2. 自动代码生成 :Sqoop能够自动生成用于导入导出数据的代码,这使得开发者无需深入了解底层的复杂性。

    • Sqoop原理:将导入或导出命令翻译成mapreduce程序来实现。在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。
  3. 数据类型映射 :Sqoop支持自动转换 关系型数据库和Hadoop之间不同的数据类型

  4. 增量数据导入 :Sqoop支持增量导入,这意味着它可以只导入自上次导入后发生变化的数据。

  5. 并行数据传输 :Sqoop可以并行地 从多个数据库表中导入数据,以提高数据传输效率。

  6. 数据压缩 :为了减少网络传输的数据量,Sqoop支持数据压缩

  7. 错误处理 :Sqoop提供了错误处理机制,例如在数据导入过程中遇到错误时,可以选择跳过错误记录或停止操作。

  8. 集成 :Sqoop可以与Hadoop生态系统中的其他组件(如Hive和HBase)集成,以支持更复杂的数据处理任务。

1.3 Sqoop的基本命令格式

  • 导入数据
java 复制代码
sqoop import \
--connect <JDBC连接字符串> \
--username <用户名> \
--password <密码> \
--table <表名> \
--target-dir <目标目录> \
--fields-terminated-by <字段分隔符> \
--lines-terminated-by <行分隔符> \
--columns <列名列表>
  • 导出数据
java 复制代码
sqoop export \
--connect <JDBC连接字符串> \
--username <用户名> \
--password <密码> \
--table <表名> \
--input-null-string <输入中表示NULL值的字符串> \
--input-null-non-string <输入中表示NULL值的非字符串值> \
--export-dir <导出数据的源目录> \
--input-fields-terminated-by <输入字段的分隔符> \
--input-lines-terminated-by <输入行的分隔符> \
--columns <列名列表>
  • 增量导入数据语法示例
java 复制代码
sqoop import \
--connect <JDBC连接字符串> \
--username <用户名> \
--password <密码> \
--table <表名> \
--target-dir <目标目录> \
--incremental <模式> \
--check-column <检查列> \
--last-value <上次导入的值>
  • 列出数据库语法示例:
java 复制代码
sqoop list-databases 
--connect jdbc:mysql://hadoop102:3306/ 
--username root 
--password root
  • 查看表的结构语法示例:
java 复制代码
sqoop eval \
--connect <JDBC连接字符串> \
--username <用户名> \
--password <密码> \
--query "DESCRIBE <表名>"

Sqoop是Hadoop生态系统中重要的数据迁移工具,它简化了传统数据库与大数据平台之间的数据交换过程

二、Sqoop的简单使用案例

2.1 导入数据

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

2.1.1 RDBMS 到 HDFS

  1. 确定Mysql服务开启正常

  2. 在Mysql中新建一张表并插入一些数据

    sql 复制代码
    $ mysql -uroot -p000000 
    mysql> create database company; 
    mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255)); 
    mysql> insert into company.staff(name, sex) values('Stan', 'Male'); 
    mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale'); 
  3. 导入数据

  • 全部导入

    bash 复制代码
    $ bin/sqoop import \ 
    --connect jdbc:mysql://hadoop102:3306/company \ 
    --username root \ 
    --password 000000 \ 
    --table staff \ 
    --target-dir /user/company \ 
    --delete-target-dir \ 
    --num-mappers 1 \ 
    --fields-terminated-by "\t" 
  • 查询导入

    bash 复制代码
    $ bin/sqoop import \ 
    --connect jdbc:mysql://hadoop102:3306/company \ 
    --username root \ 
    --password 000000 \ 
    --target-dir /user/company \ 
    --delete-target-dir \ 
    --num-mappers 1 \ 
    --fields-terminated-by "\t" \ 
    --query 'select name,sex from staff where id <=1 and $CONDITIONS;' 

    提示:must contain '$CONDITIONS' in WHERE clause.

    如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。

  • 导入指定列

    bash 复制代码
    $ bin/sqoop import \ 
    --connect jdbc:mysql://hadoop102:3306/company \
    --username root \ 
    --password 000000 \ 
    --target-dir /user/company \ 
    --delete-target-dir \ 
    --num-mappers 1 \ 
    --fields-terminated-by "\t" \ 
    --columns id,sex \ 
    --table staff

    提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格。

  • 使用sqoop关键字筛选查询导入数据

    bash 复制代码
    $ bin/sqoop import \ 
    --connect jdbc:mysql://hadoop102:3306/company \ 
    --username root \ 
    --password 000000 \ 
    --target-dir /user/company \ 
    --delete-target-dir \ 
    --num-mappers 1 \ 
    --fields-terminated-by "\t" \ 
    --table staff \ 
    --where "id=1"

2.1.2 RDBMS 到 Hive

bash 复制代码
$ bin/sqoop import \ 
--connect jdbc:mysql://hadoop102:3306/company \ 
--username root \ 
--password 000000 \ 
--table staff \ 
--num-mappers 1 \ 
--hive-import \ 
--fields-terminated-by "\t" \ 
--hive-overwrite \ 
--hive-table staff_hive

提示:该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到 Hive仓库(默认还是存储到HDFS上)。

2.1.3 RDBMS 到 Hbase

bash 复制代码
$ bin/sqoop import \ 
--connect jdbc:mysql://hadoop102:3306/company \ 
--username root \ 
--password 000000 \ 
--table company \ 
--columns "id,name,sex" \ 
--column-family "info" \ 
--hbase-create-table \ 
--hbase-row-key "id" \ 
--hbase-table "hbase_company" \ 
--num-mappers 1 \ 
--split-by id

提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能.

解决方案:手动创建HBase表

bash 复制代码
hbase> create 'hbase_company,'info'

2.2 导出数据

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

2.2.1 Hive/HDFS到RDBMS

bash 复制代码
$ bin/sqoop export \ 
--connect jdbc:mysql://hadoop102:3306/company \ 
--username root \ 
--password 000000 \ 
--table staff \ 
--num-mappers 1 \ 
--export-dir /user/hive/warehouse/staff_hive \ 
--input-fields-terminated-by "\t"

提示:Mysql中如果表不存在,不会自动创建。

三、脚本打包

使用opt格式的文件打包sqoop命令,然后执行。

  1. 创建一个.opt文件
bash 复制代码
$ mkdir opt 
$ touch opt/job_HDFS2RDBMS.opt 
  1. 编写sqoop脚本
bash 复制代码
$ vi opt/job_HDFS2RDBMS.opt 
export --connect jdbc:mysql://hadoop102:3306/company 
--username root 
--password 000000 
--table staff 
--num-mappers 1 
--export-dir /user/hive/warehouse/staff_hive 
--input-fields-terminated-by "\t" 
  1. 执行该脚本
bash 复制代码
$ bin/sqoop --options-file opt/job_HDFS2RDBMS.opt

四、Sqoop一些常用命令及参数

4.1 导入数据命令选项

参数 描述
--connect 指定数据库 连接URL
--username 指定数据库 用户名
--password 指定数据库 密码
--table 指定要导入的数据库表名
--columns 指定要导入的列
--target-dir 指定导入数据的目标目录
--where 指定导入数据的条件
--split-by 指定用于拆分数据的列
--num-mappers 指定并行导入的Mapper数量
--null-string 指定数据库中表示NULL值的字符串
--null-non-string 指定数据库中表示NULL值的非字符串值

4.2 导出数据命令选项

参数 描述
--connect 指定数据库连接URL
--username 指定数据库用户名
--password 指定数据库密码
--table 指定要导出的数据库表名
--export-dir 指定导出数据的源目录
--columns 指定要导出的列
--input-fields-terminated-by 指定输入字段的分隔符
--input-lines-terminated-by 指定输入行的分隔符
--input-null-string 指定输入中表示NULL值的字符串
--input-null-non-string 指定输入中表示NULL值的非字符串值

4.3 通用命令选项

参数 描述
--verbose 显示详细的调试信息
--compress 启用压缩
--direct 使用直接模式进行导入/导出
--as-avrodatafile 将数据导入/导出为Avro文件
--as-parquetfile 将数据导入/导出为Parquet文件
--as-textfile 将数据导入/导出为文本文件
--delete-target-dir 在导入之前删除目标目录
--fields-terminated-by 指定字段的分隔符
--lines-terminated-by 指定行的分隔符
--null-string 指定输出中表示NULL值的字符串
--null-non-string 指定输出中表示NULL值的非字符串值

这只是Sqoop的一些常见命令选项,还有其他更多选项可用于满足特定的需求。你可以通过运行sqoop help命令来获取完整的命令选项列表和详细的帮助信息。

参考文献

Sqoop基础理论与常用命令详解(超详细)
Sqoop User Guide (v1.4.7) (apache.org)
大数据视频_Sqoop视频教程_哔哩哔哩_bilibili


2024年10月14日 14点56分

数据采集工具------Sqoop内容学习整理,如有错误,欢迎评论区交流指出。

不积跬步无以至千里!

相关推荐
zy张起灵2 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
zhixingheyi_tian2 小时前
Spark 之 Aggregate
大数据·分布式·spark
PersistJiao2 小时前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
宅小海5 小时前
scala String
大数据·开发语言·scala
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
小白的白是白痴的白5 小时前
11.17 Scala练习:梦想清单管理
大数据
java1234_小锋5 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
猫爪笔记7 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
pq113_67 小时前
ftdi_sio应用学习笔记 3 - GPIO
笔记·学习·ftdi_sio
澄澈i7 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式