阅读:
59
1.目的
对于每个Sqoop调用,都需要Sqoop连接器(Connector)和驱动 (Driver)。在本章中,我们将学习Sqoop中Sqoop Connector和Driver的概念。 将看到 Sqoop Connector和Sqoop Driver的例子来理解我们理解这两个概念。
—-add picture here —-
2.Sqoop Driver
在Sqoop中,Driver是指JDBC驱动程序。 JDBC是用于访问关系数据库和一些数据仓库的标准Java API。 Java语言规定了此接口包含的类和方法。 每个数据库供应商编写自己的实现与相应的数据库进行通信。
每个数据库供应商创建驱动程序 , 用户需要单独下载驱动程序,并在使用之前将Driver安装到Sqoop中。
3.Sqoop Connector
为了与关系型数据库系统进行通信,我们使用结构化查询语言(SQL)编程语言。几乎每种数据库都有自己的SQL Dialect。通常,所有数据库的基本操作都是相同的,但是,某些语句可能以不同的方式实现。从数据库服务器进行导入数据或导出数据操作,SQL 并不是最高效的方式。
通过使用Sqoop Connector,可以克服各种数据库支持的SQL Dialect的差异,并提供优化的数据传输。通过 可插拔的Connector, 可以获取有关的传输数据列,数据类型等元数据,从而以最有效的方式来驱动数据传输。
Sqoop 本身自带一个 Basic Connector,就是Sqoop中所称的通用JDBC Connector。它使用JDBC接口来访问元数据和传输数据。这种方式不是最优的,但该通用连接器可以在大多数的数据库上工作。此外,Sqoop附带专用连接器, 比如对MySQL,PostgreSQL,Oracle,Microsoft SQL Server,DB2和Netezza数据库,提供专门的连接器。
接下来,我们将了解Sqoop Connector如何分区,格式化它们的输出,提取数据和加载数据。
Sqoop Connectors – Partitioner
它会产生条件 (Condition)来供提取器 (Extractor)使用。另外,它会根据分区列数据类型对数据传输进行分区。分区策略大致如下:
(upper boundary – lower boundary) / (max partitions)
默认情况下,进行分区数据,主键将被使用。
目前支持各种数据类型,如下:
TINYINT
SMALLINT
INTEGER
BIGINT
REAL
FLOAT
DOUBLE
NUMERIC
DECIMAL
BIT
BOOLEAN
DATE
TIME
TIMESTAMP
CHAR
VARCHAR
LONGVARCHAR
Sqoop Connectors – Extractor
在提取 (Extractor)阶段使用SQL查询,根据配置,这个SQL会有所不同。如下:
如果提供了表名,则生成的SQL语句将采用SELECT * FROM
如果提供了表名和列,则生成的SQL语句将采用SELECT FROM
如果提供了SQL语句,则将使用提供的SQL语句。
注意,由分区(Partitioner)程序生成的条件将附加到SQL查询的末尾以查询一部分数据。
Sqoop Connectors – Loader
在加载阶段,使用SQL语句来加载数据到JDBC数据源。根据配置,SQL会有所不同。
如果提供了表名,则生成的SQL语句将采用INSERT INTO
如果提供了表名和列,则生成的SQL语句将采用INSERT INTO
如果提供了SQL语句,将使用提供的SQL语句。
Sqoop Connectors – Destroyer
连接器在目标数据源上执行下列操作:
将 Staging table的内容复制到所需的表中;
清除Staging table (临时表);
在FROM方向上,不执行任何操作;
4.如何使用Sqoop驱动程序和连接器
下面来了解Sqoop如何连接到数据库以及如何使用驱动程序和连接器。
Sqoop会根据指定的命令行参数和所有可用的连接器来尝试加载数据的最佳Connector。
Sqoop将查看是否可以使用内置的专有连接器的数据库。 例如,对于用于MySQL的jdbc:mysql:// URL,Sqoop将选择为MySQL优化的MySQL连接器。如果不能使用任何专有的连接器,Sqoop将默认为通用JDBC连接器连接器。
最终,确定了Sqoop连接器和驱动 之后,就可以建立Sqoop客户端和目标数据库之间的连接。 请看下面的图:
—-add picture here 0—
Sqoop Connector and Driver