Apache Sqoop教程: Archi结构、命令和示例
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 生成了一个 Java 该类镜像表格中的一行,然后提交一个仅包含映射的内容。 映射简化 作业。每个映射任务读取拆分列范围的自身切片,因此吞吐量随映射器的数量而扩展,而不是随单个 JDBC 游标的数量而扩展。
此外,Sqoop 还提供各种第三方数据存储连接器,涵盖企业级和高级存储。 数据仓库 (包括 Netezza、Teradata 和 Oracle) 到 NoSQL 存储(例如 Couchbase)。但是,这些连接器不随 Sqoop 捆绑包提供;需要单独下载,并且可以轻松添加到现有的 Sqoop 安装中。
为什么我们需要 Sqoop?
使用 Hadoop 进行分析处理需要将来自不同来源的大量数据加载到 Hadoop 集群中。将来自异构来源的大量数据加载到 Hadoop 中,然后对其进行处理,这一过程面临着一系列挑战。在选择正确的数据加载方法之前,需要考虑的因素包括维护和确保数据一致性以及确保资源的有效利用。
主要问题:
- 使用脚本加载数据 — 传统的脚本加载数据方法不适用于将大量数据加载到 Hadoop 中;这种方法效率低下且非常耗时。
- 通过 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 平台,例如 拓蓝 | 预置连接器、调度和血缘关系管理,无需手动编写作业。 |

