Apache Sqoop教程: Archi结构、命令和示例

⚡ 智能摘要

Apache Sqoop 使用连接器架构在关系数据库和 HDFS 之间移动大量数据,生成 MapReduce 作业,将表导入 Hive 或 HBase,并将处理后的结果导出回源系统。

  • 🔘 定义: Sqoop 通过基于插件的连接器层在结构化存储和 HDFS 之间传输批量数据。
  • ☑️ 结 构: 每个作业都会编译成一个仅包含 Map 操作的 MapReduce 程序,其任务并行地从表中提取不同的切片。
  • 连接器: 捆绑式驾驶员保险 MySQL, PostgreSQL, OracleSQL Server 和 DB2,以及通用的 JDBC 回退方案。
  • 🧪 命令: 导入工具将表导入 HDFS、Hive 或 HBase;导出工具将处理后的文件推送回表。
  • 🛠️ 加载模式: 完全加载会复制整个表,而追加和最后修改的增量模式只会获取新行。
  • ⚠️ 项目状态: Sqoop于2021年7月退休,回到了Apache Attic。 Spark JDBC 和 NiFi 现在承载着新的管道。

Apache Sqoop 教程,涵盖架构、连接器以及导入和导出命令

Hadoop 中的 SQOOP 是什么?

阿帕奇·史考普 (SQL-to-Hadoop) 是一款旨在支持批量数据导出和导入的工具。 高密度文件系统 它支持从结构化数据存储(例如关系数据库、企业数据仓库和 NoSQL 系统)迁移数据。它是一款基于连接器架构的数据迁移工具,支持插件以连接到新的外部系统。

Hadoop Sqoop 的一个示例用例是,一家企业每天晚上运行一次 Sqoop 导入,将当天的数据从生产事务 RDBMS 加载到 蜂房 数据仓库以供进一步分析。

接下来在本 Apache Sqoop 教程中,我们将了解 Apache Sqoop 架构。

勺子 Archi质地

所有现有的 数据库管理系统 设计有 SQL 标准。但是,每个 DBMS 在方言方面都存在一定差异。因此,这种差异在系统间数据传输时带来了挑战。Sqoop 连接器是帮助克服这些挑战的组件。

借助 Sqoop 连接器,可以实现 Sqoop Hadoop 和外部存储系统之间的数据传输。

Sqoop 具有可与多种流行关系数据库配合使用的连接器,包括 MySQL, PostgreSQL, Oracle、SQL Server 和 DB2。每个连接器都知道如何与其关联的 DBMS 交互。还有一个通用 JDBC 连接器,用于连接到支持 JavaSqoop 还支持 JDBC 协议。此外,Sqoop 还提供了优化的 JDBC 协议。 MySQL 和 PostgreSQL 使用数据库特定的 API 来有效地执行批量传输的连接器。

下图将 Sqoop 客户端置于外部数据存储和 Hadoop 集群之间,连接器层位于一侧,HDFS、Hive 和 HBase 位于另一侧。

Sqoop架构图展示了连接关系数据库管理系统(RDBMS)和Hadoop集群的连接器层。

在连接器层之下,Sqoop 生成了一个 Java 该类镜像表格中的一行,然后提交一个仅包含映射的内容。 映射简化 作业。每个映射任务读取拆分列范围的自身切片,因此吞吐量随映射器的数量而扩展,而不是随单个 JDBC 游标的数量而扩展。

此外,Sqoop 还提供各种第三方数据存储连接器,涵盖企业级和高级存储。 数据仓库 (包括 Netezza、Teradata 和 Oracle) 到 NoSQL 存储(例如 Couchbase)。但是,这些连接器不随 Sqoop 捆绑包提供;需要单独下载,并且可以轻松添加到现有的 Sqoop 安装中。

为什么我们需要 Sqoop?

使用 Hadoop 进行分析处理需要将来自不同来源的大量数据加载到 Hadoop 集群中。将来自异构来源的大量数据加载到 Hadoop 中,然后对其进行处理,这一过程面临着一系列挑战。在选择正确的数据加载方法之前,需要考虑的因素包括维护和确保数据一致性以及确保资源的有效利用。

主要问题:

  1. 使用脚本加载数据 — 传统的脚本加载数据方法不适用于将大量数据加载到 Hadoop 中;这种方法效率低下且非常耗时。
  2. 通过 MapReduce 应用程序直接访问外部数据 — 为 MapReduce 应用提供对外部系统数据的直接访问(无需加载到 Hadoop 中)会使这些应用变得复杂。因此,这种方法不可行。

除了能够处理海量数据外,Hadoop 还能处理多种不同形式的数据。因此,为了将这些异构数据加载到 Hadoop 中,人们开发了各种不同的工具。 勺子水槽 就是两个这样的数据加载工具。

接下来,在本带有示例的 Sqoop 教程中,我们将了解 Sqoop、Flume 和 HDFS 之间的区别。

Hadoop 中的 Sqoop、Flume 和 HDFS

勺子 水槽 高密度文件系统
Sqoop 用于从结构化数据源(如 RDBMS)导入数据。 Flume 用于将批量流数据移动到 HDFS。 HDFS是Hadoop生态系统用于存储数据的分布式文件系统。
Sqoop 具有基于连接器的架构。连接器知道如何连接到相应的数据源并获取数据。 Flume 具有基于代理的架构。这里编写了一个代码(称为“代理”),负责获取数据。 HDFS 具有分布式架构,其中数据分布在多个数据节点上。
HDFS 是使用 Sqoop 导入数据的目的地。 数据通过零个或多个通道流向 HDFS。 HDFS 是数据存储的最终目的地。
Sqoop 数据加载不是事件驱动的。 Flume数据加载可以由事件驱动。 HDFS 仅存储通过任何方式提供给它的数据。
为了从结构化数据源导入数据,人们只能使用 Sqoop 命令,因为它的连接器知道如何与结构化数据源交互并从中获取数据。 为了加载流数据(例如 Twitter 上生成的推文或 Web 服务器的日志文件),应该使用 Flume。Flume 代理是为获取流数据而构建的。 HDFS 有其内置的 shell 命令用于存储数据。HDFS 无法导入流式数据。

Sqoop 的主要特点

上面的比较说明了 Sqoop 的定位。下面的功能集决定了它是否适合特定的数据摄取任务。

  • 满载: 一条命令即可复制整个表。 import-all-tables 一次性复制模式中的所有表。
  • 增量加载: append 模式 tracks 是一个单调递增的列,例如代理键,而 lastmodified 模式 tracks 是一个时间戳列,因此只有新增或更改的行才会传输。
  • 并行传输: 拆分列将键范围划分到映射任务中,映射器计数设置一次运行多少个映射器。
  • 自由格式查询导入: 可以导入任意 SQL 语句的结果,而不是整个表,这样连接和筛选操作就保留在数据库端。
  • 直接装货入库: 导入操作可以创建并填充一个 蜂房 表或直接写入 HBase 表,而不是停止ping 原始HDFS文件。
  • 压缩和文件格式: 输出可以写成分隔文本、SequenceFile、Avro 或 Parquet 格式,并可选择进行编解码器级别的压缩。
  • 安全性: Sqoop 与 Kerberos 集成,凭据可以从密码文件中读取,也可以通过提示输入,而无需在命令行中键入。

Sqoop导入和导出命令

双向传输均通过同一个命令行工具完成。导入工具将数据库中的行移动到 Hadoop,导出工具将 Hadoop 中的文件移动回数据库表。

典型的导入语句会指定 JDBC 连接、源表、目标目录、拆分列和映射器计数:

sqoop import \
  --connect jdbc:mysql://localhost:3306/employees \
  --username hadoop \
  --password-file /user/hadoop/.mysql.password \
  --table employees \
  --target-dir /user/hadoop/warehouse/employees \
  --split-by emp_no \
  --num-mappers 4

导出操作会逆转数据流。它会读取 HDFS 目录中已存在的分隔符文件,并将它们插入到现有表中,因此必须先创建目标表:

sqoop export \
  --connect jdbc:mysql://localhost:3306/employees \
  --username hadoop \
  --password-file /user/hadoop/.mysql.password \
  --table employee_summary \
  --export-dir /user/hadoop/warehouse/employee_summary \
  --input-fields-terminated-by ','

夜间作业很少需要两次导入整个表。增量导入会记录已见过的最高值,并在下次运行时从该值开始:

sqoop import \
  --connect jdbc:mysql://localhost:3306/sales \
  --table orders \
  --incremental append \
  --check-column order_id \
  --last-value 15000 \
  --target-dir /user/hadoop/warehouse/orders

这些论点几乎出现在每份工作中:

争论 它控制什么
--connect 数据库连接 URL 源数据库或目标数据库。
--table 导入时读取的表或导出时写入的表。
--target-dir 接收导入的HDFS目录。该目录必须尚未存在。
--export-dir 导出操作读取的HDFS目录。
--split-by 该列的范围被地图任务分割。
--num-mappers (-m) 并行映射任务的数量。默认值为 4。
--incremental 选择 append or lastmodified 更改 trac王。
--hive-import 创建匹配的 Hive 表并将导入的数据加载到该表中。

⚠️ 注意: 导出操作并非单一事务。每个映射任务都会提交自己的批次,因此,如果执行过程中出现故障,可能会导致部分数据残留在目标表中。当必须一次性完成所有加载操作时,应将写入操作路由到暂存表。

Sqoop项目现状及现代替代方案

在上述任何命令进入调度程序之前,有一个版本细节至关重要。

Sqoop 的开发商于 2021 年 6 月投票决定终止该项目,并搬迁至…… 阿帕奇阁楼 已于 2021 年 7 月完成。网站、邮件列表、Git 仓库、问题 trac所有 ker 和下载链接仍然可用,但均为只读模式,且不再有新版本发布计划。最后一个正式版是 2017 年发布的 Sqoop 1.4.7;独立的 Sqoop 2 系列(1.99.x)从未达到与 1.4.7 相同的功能,也从未被宣布为正式版。

现有的 Sqoop 作业仍然在运行,商业 Hadoop 发行版也继续在其平台内提供并支持该工具。然而,新的数据摄取工作通常会基于以下方案之一进行构建:

可再生 最合适
Spark 使用 JDBC 数据源 批处理表示例trac已经位于内部的 Spark 使用分区读取而不是映射器的流水线。
阿帕奇尼菲 基于流的、可视化配置的多个异构系统之间的路由。
Kafka Connect 与 CDC 连接器 用持续变化数据采集代替每晚的批量数据采集窗口。
托管式 ETL 平台,例如 拓蓝 预置连接器、调度和血缘关系管理,无需手动编写作业。

常见问题

Sqoop 1 是所有教程中使用的唯一命令行客户端。Sqoop 2 添加了服务器、REST API 和 Web UI,但其功能始终未能与 Sqoop 1 完全一致,也从未被标记为生产就绪版本,因此 1.4.x 系列版本仍然是标准版本。

模型通过分析源表来推断类型、键和拆分列,根据行分布建议分区边界,并在加载失败前标记模式漂移。它们还通过识别样本数据中的单调或时间戳行为来建议增量检查列。

Copilot 可以快速生成参数框架,但它混用了 Sqoop 1 和 Sqoop 2 的语法,并且创建了一些任何版本都不接受的标志。在安排任务之前,请务必对照已安装版本的 Sqoop 用户指南检查每个参数。

Sqoop 无法自动选择拆分列,导入会失败。您可以显式地指定一个合适的数值或日期列作为拆分列,或者强制执行单个映射任务,该任务会将传输过程序列化。

在命令行中输入的密码对任何列出进程的用户都是可见的。请将其存储在只有作业所有者才能读取的 HDFS 文件中,并将密码文件参数指向该文件,或者改用交互式提示符。

默认格式为分隔符文本。同时支持 SequenceFile、Avro 和 Parquet 格式,每种格式都可通过各自的参数进行选择。列式 Parquet 格式更适合后续的分析查询,而分隔符文本格式则最易于检查和导出。

默认值为 4,这是一个合理的起点。映射器越多,对数据库的并发连接数就越多,因此实际的上限取决于源服务器的承受能力,而不是 Hadoop 集群的调度能力。

A Java 运行时,已配置 Hadoop的 客户端需要能够连接到集群,并且目标数据库的 JDBC 驱动程序 JAR 文件必须放置在 Sqoop 库目录中。缺少驱动程序 JAR 文件是导致首次运行失败的最常见原因。

总结一下这篇文章: