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

相关推荐
chat2tomorrow33 分钟前
如何构建类似云数据仓库 Snowflake 的本地数据仓库?
大数据·数据仓库·低代码·数据治理·snowflake·sql2api
weixin_3077791314 小时前
Azure Synapse Dedicated SQL pool里大型表对大型表分批合并数据的策略
数据仓库·sql·microsoft·azure
宝哥大数据16 小时前
数据中台、数据湖和数据仓库 区别
大数据·数据仓库·数据湖
龙石数据16 小时前
数据中台(大数据平台)之数据仓库建设
大数据·数据仓库·spark·数据中台
烂漫心空20 小时前
Windows 系统如何使用Redis 服务
数据库·数据仓库·redis·mysql·缓存·数据库架构
RestCloud1 天前
谷云科技iPaaS集成平台4月发布新版本V7.4
科技·api·数据安全·etl·数据集成·ipaas·集成平台
mysql学习中3 天前
hive数仓要点总结
数据仓库·hive·hadoop
IT成长日记3 天前
【Hadoop入门】Hadoop生态之Sqoop简介
大数据·hadoop·sqoop
chat2tomorrow3 天前
SQL2API是什么?SQL2API与BI为何对数据仓库至关重要?
数据库·数据仓库·低代码·bi·数据中台·sql2api
派可数据BI可视化4 天前
数据中台、BI业务访谈(二):组织架构梳理的坑
数据仓库·人工智能·信息可视化·数据分析·商业智能bi