ETL的使用(sqoop):数据导入,导出

ETL

ETL: 是数据抽取(Extract)、数据转换(Transform)和数据加载(Load)的整个过程

常用的ETL工具

sqoop

1.Apache Sqoop 是 Apache 软件基金会旗下的一个开源项目,旨在帮助用户高效地在 Hadoop 生态系统和关系型数据库之间传输大量数据

2.可以将数据在关系型数据库(如MySQL、Oracle、PostgreSQL等)和 Hadoop生态系统(如HDFS、Hive、HBase等)中进行迁移

sqoop官网Sqoop -

更多内容,阅读文档Sqoop 文档 (v1.4.7)

Kettle

也被称为Pentaho Data Integration (PDI),是一个开源的数据处理工具,用于数据集成和数据转换。它由Pentaho公司开发,是Pentaho开源商业智能套件的一部分。Kettle提供了一个图形用户界面(GUI),允许用户通过拖放组件和定义数据流来设计数据处理任务,而无需编写代码

工作中, sqoop更常用, 因为更高效

sqoop的命令

在终端命令窗口输入

sqoop version

会显示当前安装的 Sqoop 版本信息

Sqoop 的版本是 1.4.7-cdh6.2.1

sqoop help

查看特定命令的帮助,示例

sqoop help import

Common arguments: 常见参数

导入数据:全量导入

全量数据(Full Data) : 就是全部数据,所有数据。如对于表来说,就是表中的所有数据。

增量数据(Incremental data): 就是上次操作之后至今产生的新数据。

数据子集: 也叫做部分数据。整体当中的一部分。

导入和导出: sqoop安装在hadoop, 数据从关系型数据库到HDFS 叫导入数据,反之叫导出

HDFS: Hadoop的分布式文件系统

数据流向: 上流系统>>ETL>>下流系统 即 业务数据>>ETL>>数仓

示例: TiDB数据库的数据>>ETL工具: sqoop>>HDFS

准备数据源: 导入数据到数据库(mysql)示例

全量导入TiDB的数据到HDFS的命令

命令解释:

  1. sqoop import: 这是Sqoop命令,用于从关系型数据库(如MySQL)导入数据到HDFS。

  2. --connect jdbc:mysql://192.168.105.200:4000/userdb: 指定要连接的TiDB数据库的JDBC URL。这里,数据库服务器IP是192.168.105.200,端口是4000,数据库名称是userdb。

  3. --username root: 指定连接TiDB数据库的用户名,这里是root。

  4. --password 123456: 指定连接TiDB数据库的密码,这里是123456。

  5. --table emp: 指定要从TiDB数据库中导入的表,这里是emp表。

  6. --target-dir /user/sqoop_data/sjh/result1: 指定HDFS上的目标目录,导入的数据将存储在这个目录中。

  7. -m 1 : 指定使用1个map任务来执行导入操作。这个参数控制并行度,1表示不使用并行处理。如果不指定 -m 1,Sqoop会根据默认行为来决定使用多少个map任务。Sqoop默认会根据表的主键或指定的分割列(split-by column)自动选择并行度。如果没有指定 -m 参数,Sqoop通常会使用4个map任务(这是Sqoop的默认并行度)。如果表没有主键,且没有指定 --split-by 参数来选择一个列用于分割数据,Sqoop将无法自动并行化导入操作,这时会回退到使用单个map任务(相当于 -m 1)。

  8. 空格加斜杠是换行,注意斜杠后别空格; 没有斜杠时回车表示执行命令,有斜杠表示未完待续

可以代替-m 1的方式

使用 --split-by 强制单任务

如果表中有主键或唯一键,Sqoop 会根据该键自动拆分任务。如果没有主键,Sqoop 会提示你指定 --split-by 列。如果你不希望拆分任务,可以指定一个常量列(如 --split-by 一个固定值),但这通常不推荐,因为可能会导致数据倾斜。

mysql和TiDB

mysql的默认端口号是3306,如果想从mysql中通过sqoop导入数据到HDFS,修改上方命令的端口号即可;

TiDB是一个分布式SQL数据库,它与MySQL兼容,并且设计上支持MySQL协议。这意味着许多为MySQL设计的工具和客户端(如Sqoop)也可以与TiDB一起使用。

  1. 兼容性:TiDB与MySQL高度兼容,因此使用MySQL的工具(如Sqoop)可以直接与TiDB交互。

  2. 特定环境配置:在某些环境中,可能已经配置了TiDB来替代MySQL,或者TiDB被用作MySQL的替代品。

示例

"Running job" 这一行表示Sqoop已经成功提交了一个MapReduce作业到Hadoop集群,并且该作业正在执行中。

这代表着数据的导入已经完成

检验:通过Hue, 通过命令窗口查看,不能通过hive查看

Hue

数据被导入HDFS后会生成2个文件,第一个文件的内容是动态生成的日志信息,具体包括作业的执行状态、数据传输量、耗时等;第二个文件内容是导入的数据

通过命令端口查看

导入时指定分隔符

把TiDB的数据导入hive

示例

注意:数据导入hive的底层逻辑是>>数据会先被导入到HDFS再到hive

所以,如果前面有把数据导入到HDFS, 需要先把该文件删掉

验证: 通过Hue查看/hive查看/通过命令窗口查看

导入数据在Hue的位置

**非textfile格式的文件/**HCataLog API

HCataLog API 提供了一种编程方式来访问 Hive 的元数据存储(即 Hive Metastore),允许开发者执行诸如创建、修改、删除数据库和表等操作。

sqoop 原生参数支持的存储格式只有 textfile ,如果遇到其他格式 可以借助 HCataLog API

非textfile格式的文件 全量导入TiDB的数据到HDFS的命令,不指定分隔符

  • --hcatalog-database sjh:指定 HCatalog 数据库名称,这里是 sjh。HCatalog 是 Hadoop 的表存储管理层,允许使用 Hive 表。

  • --hcatalog-table emp4:指定 HCatalog 中的目标表名,这里是 emp4。数据将被导入到这个 Hive 表中。

非textfile格式的文件 全量导入TiDB的数据到HDFS的命令,指定分隔符

  • --fields-terminated-by '\t':指定导入数据时字段之间的分隔符,这里是制表符 (\t)。这个选项通常用于文本文件格式。

增量导入数据

方法一: where 条件

--hive-table sjh.emp_add: 其中sjh是数据库名, emp_add是表名

方法二: sqoop自带的参数

设计思路: 对某一个列的值进行判断,只要大于上一次的值就会导入

参数格式

--check-column 列

--last-value 值

--incremental 导入模式(导入模式有: append 或 lastmodified)

append模式

1.先全量导入

-P:这个选项提示用户在执行命令时输入密码. 相当于命令中写 --password 123456

这2种方式的区别

2.业务数据库增加数据

3.使用append完成增量导入

使用 Apache Sqoop 工具从 MySQL 数据库中导入数据到 HDFS

解释:

  1. --check-column id:指定用于增量导入的检查列。增量导入是指只导入自上次导入以来有变化的数据。这里使用 id 列来检查数据的变化。

  2. --last-value 1205:指定增量导入的起始值。这里表示从 id 为 1205 的记录开始导入数据。

  3. --incremental append:指定增量导入模式为 append,即在现有的数据文件中追加新导入的数据。

lastmodified 模式

特点: 即导入新增数据也导入更新数据

数据源准备

先全量导入

在关系型数据库和 HDFS 之间传输数据

使用 lastmodified 实现 插入并更新

  • --check-column last_mod:指定用于增量导入的列,这里是 last_mod 列。Sqoop 会根据这个列的值来判断哪些数据是新增或修改的。

  • --last-value "2025-02-12 15:59:36":指定上次导入的最后一个值。Sqoop 会导入 last_mod 列值大于这个时间戳的记录。

  • --incremental lastmodified:指定增量导入的模式为 lastmodified,即基于时间戳的增量导入。Sqoop 会导入 last_mod 列值大于 --last-value 的记录。

  • --merge-key id:指定合并键列,这里是 id 列。Sqoop 会根据这个列的值来合并新导入的数据和已有数据。如果新导入的数据与已有数据的 id 相同,Sqoop 会更新已有数据。

3种增量导入方式的区别与适用场景

append模式Sqoop 会自动记录上次导入的最大值, 为什么还指定last-value

导出数据

Sqoop导出:需要用户提前手动创建同结构的表

hdfs -》 Mysql

在mysql中建表>>目标表

使用 Apache Sqoop 工具将数据从 HDFS 导出到 MySQL 数据库

hive --> mysql

在hive建表>>源表

在mysql建表

使用 Apache Sqoop 工具将数据从 hive 导出到 MySQL 数据库的命令

注意:如果hive的底层表是orc格式进行存储的,则必须使用 HcataLog API

相关推荐
RestCloud6 小时前
产品更新丨谷云科技ETLCloud 3月更新速递
大数据·科技·etl·数字化转型·cdc·数据集成工具·功能升级
派可数据BI可视化9 小时前
商业智能BI分析中,汽车4S销售行业的返厂频次有什么分析价值?
大数据·数据仓库·信息可视化·数据分析·商业智能bi
闯闯桑2 天前
hive 中优化性能的一些方法
数据仓库·hive·hadoop
闯闯桑2 天前
hive 中可能产生小文件的场景
数据仓库·hive·hadoop
RestCloud2 天前
ETL与ELT核心技术解析:如何选择最优数据集成方案
数据仓库·etl·数字化转型·数据集成工具·elt
weixin_307779132 天前
稳定运行的以Oracle数据库为数据源和目标的ETL性能变差时提高性能方法和步骤
数据库·oracle·性能优化·etl
weixin_307779133 天前
Visual Studio 2022和C++实现带多组标签的Snowflake SQL查询批量数据导出程序
开发语言·c++·数据仓库·sql·云计算
那条还没翻身的咸鱼3 天前
kettle-打不开提示Could not find the main class
etl
viperrrrrrrrrr73 天前
大数据学习(67)- Flume、Sqoop、Kafka、DataX对比
大数据·学习·kafka·sqoop·flume·datax
精神病不行计算机不上班4 天前
【数据仓库与数据挖掘基础】第二章 数据仓库原理
数据仓库·数据挖掘·spark