Sqoop 简介

1. Sqoop简单介绍

    Sqoop是一款开源的工具,主要用于在Hadoop和传统的数据库(mysql、postgresql等)进行数据的传递,可以将一个关系型数据库(例如:MySQL、Oracle、PostgreSQL等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 

    Sqoop中一大亮点就是可以通过hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS。 

2. Sqoop 工具简介

 Sqoop提供了很多工具来帮组我们完成数据传递。 可以使用Sqoop,指定我们想使用的工具,然后加上对应的参数即可。

格式是: sqoop tool-name [tool-arguments]

Sqoop带一个帮助(Help)工具。 键入以下Sqoop命令,可以显示所有可用工具的列表:

Sqoop help

使用方法: sqoop COMMAND [ARGS]

支持如下的命令:

1542507964809066.png

通过输入sqoop help toolname,我们可以显示特定工具的帮助。 如sqoop help import。

1542508088925304.png

下面介绍一下通用的Hadoop命令行参数,这些参数必须在任何特定的 sqoop tool的参数之前, 常用的选项是:

1542508160666843.png

注意:常用的Hadoop参数前面是一个短划线字符( – )。 但是,特定于 Sqoop Tool的参数以两个破折号( – -)开头,除非它们是单个字符参数(如-P)。

3 . 使用选项文件传递参数

可以将不会经常变动的Sqoop命令行选项放入Sqoop的选项 (option)文件中。 选项文件可以被定义为文本文件。 在一个文本文件中,每一行按照它在命令行中出现的顺序标识一个选项。我们可以指定一个选项文件,只需创建一个选项文件并将其传递给命令行即可。 通过使用-options-file参数。

我们来看一个例子。 在此,可以指定以下用于导入的Sqoop调用,如下所示:

$ sqoop import –connect jdbc:mysql://localhost/db –username foo –table TEST
$ sqoop –options-file /users/homer/work/import.txt –table TEST

选项文件/users/homer/work/import.txt包含以下内容:

import
–connect
jdbc:mysql://localhost/db
–username
foo

为了便于阅读,选项文件可以有空行和注释。 因此,如果选项文件/users/homer/work/import.txt包含以下内容,则于上述示例将完全相同:

#
# Options file for Sqoop import
#
# Specifies the tool being invoked
import
# Connect parameter and value
–connect
jdbc:mysql://localhost/db
# Username parameter and value
–username
foo
#
# Remaining options should be specified in the command line.
#

4. Sqoop Import

Sqoop Import,它会从RDBMS向HDFS导入单独的表,也可以是全部的表,这里,在HDFS中,表中的每一行都被视为一条记录。而且,在Avro和Sequence文件中,所有记录都以文本数据的形式存储在文本文件中或作为二进制数据存储。

 Sqoop Import 的目的

从RDBMS到HDFS,导入工具导入一个单独的表。这里,在HDFS中,表中的每一行都表示为一个单独的记录。此外,我们可以将记录存储为文本文件(每行一条记录)。在二进制表示中,存储为Avro或SequenceFiles等。

语法

可以按任意顺序输入相关的import参数,而Hadoop通用参数只能在任何import参数之前。

Sqoop Import 的参数如下:

1542508411423445.png

1542508458848551.png

5. Sqoop Export

当想要将一组文件从HDFS导出回到RDBMS时,我们使用export工具。这些文件包含记录,我们称之为表中的行。 文件被读取并解析为一组记录。 另外,用户指定的分隔符分隔。

Sqoop Export的目的

当我们想要将一组文件从HDFS导出回RDBMS时,我们使用导出工具。目标表必须已经存在于数据库中。

另外,要将这些记录转换为一组INSERT语句,缺省操作是将记录注入数据库。 此外,Sqoop还可以用“更新“模式生成UPDATE语句,以取代数据库中的现有记录。 

语法

$ sqoop export(generic-args)(export-args)
$ sqoop-export(generic-args)(export-args)

导出参数可以按任意顺序输入,但是,Hadoop通用参数必须在任何导出参数之前。

1542508621238282.png

1542508686306422.png

Validation 参数列表:

1542508788924923.png

Sqoop Export 控制参数列表

1542508897299655.png

1542508936343543.png

6. Insert 和 Update

默认情况下,sqoop-export将新行添加到表中; 每个输入记录都被转换成一个INSERT语句,该语句将一行添加到目标数据库表中。 如果您的表有约束条件(例如,其值必须唯一的主键列)并且已包含数据,则必须注意避免插入违反这些约束条件的记录。 如果INSERT语句失败,导出过程将失败。 此模式主要用于将记录导出到旨在接收这些结果的新空表中。

如果指定-update-key参数,则Sqoop将修改数据库中的现有数据集。 每个输入记录都被视为修改现有行的UPDATE语句。 语句修改的行取决于使用-update-key指定的列名。 例如,请考虑下表定义:

CREATE TABLE foo(
id INT NOT NULL PRIMARY KEY,
msg VARCHAR(32),
bar INT);

假设HDFS中包含如下记录的数据集:

0, this is a test,42
1, some more data,100

运行 “sqoop-export –table foo –update-key id –export-dir /path/to/data –connect…”命令将运行如下的SQL 语句:

UPDATE foo SET msg=’this is a test’, bar=42 WHERE id=0;
UPDATE foo SET msg=’some more data’, bar=100 WHERE id=1;

如果UPDATE语句不修改任何行,不被视为错误; (实际上,这意味着基于更新的export不会将新行插入到数据库中。)同样,如果使用-update-key指定的列没有唯一标识行并且多个行由单个语句更新,也不被视为错误并正常执行。

参数-update-key也可以使用逗号分隔的列名称列表。 在这种情况下,Sqoop会在更新现有记录之前匹配此列表中的所有键值。

根据目标数据库的不同,如果要更新数据库中存在的行,可以指定带允许插入模式的-update-mode参数,如果行尚不存在,则插入行。

7 . Export 和 Transaction

导出时可以由多个Writer并行执行Export。每个Writer使用一个单独连接到数据库的连接;这些都是彼此独立的交易。此外,Sqoop使用多行INSERT语法为每条语句插入最多100条记录。每写入SQL 100个语句,写入任务中的当前事务会被提交,从而每10,000行提交一次。 Export 并不是一个原子操作过程。在导出完成之前,已经导出的部分结果将变得可见。

导出失败

到处可能失败的原因如下:

当从Hadoop集群到数据库的连接丢失时。可能由于许多原因,例如由于硬件故障或服务器软件崩溃。

试图插入违反一致性约束的行。例如,插入一个重复的主键值。

试图解析HDFS源数据中的不完整或格式不正确的记录;

在尝试解析记录时使用不正确的分隔符;

由于一些容量问题。例如,内存或磁盘空间不足;

由于这些或其他原因,如果export map任务失败,则可能导致export  job失败。每个导出任务都在单独的事务中运行, 个别Map任务会定期提交当前交易。在数据库中,任何先前提交的事务将保持持久化,导致导出部分完成。这点需要格外注意。

Sqoop 简介

发表评论

邮箱地址不会被公开。 必填项已用*标注

× 九 = 63

滚动到顶部