内容
1.Sqoop export介绍及其目的
Sqoop export 是将一组文件从HDFS导出回RDBMS的工具。 前提条件是,在数据库中,目标表必须已经存在。 根据用户指定的分隔符将输入文件读取并解析为一组记录。
默认操作是将记录转换为INSERT语句注入数据库的记录。 在“update”模式中,sqoop将生成UPDATE语句,用于替换数据库中的现有记录,在“call”模式中,sqoop将为每个记录进行存储过程调用。
2. Sqoop Export 语法
$ sqoop export (generic-args) (export-args)
可以按任意顺序输入导出参数,但Hadoop通用参数必须放在任何导出参数之前。
通用导出参数
验证参数
导出控制参数
需要-export-dir参数和-table或-call 参数。 指定要填充到数据库中的表(或要调用的存储过程),此外,指定HDFS中包含源数据的目录。
默认情况下,表格中的所有列都选择在Sqoop中导出。 通过使用-columns参数,可以选择列的一个子集并控制它们的导出时候的排序。 应该包含一个以逗号分隔的列导出列表。 如:-columns“col1,col2,col3”。
3. Insert 和 Update的差异
Sqoop export将新行添加到表中。 这里每个输入记录都被转换成一个INSERT语句,该语句向目标数据库表添加一行。 但是,如果我们的表已经包含数据并且有约束限制,我们必须小心避免插入重复记录。 因为这可能违反了约束限制。 如果INSERT语句失败,导出过程将失败。
如果指定-update-key参数,Sqoop将修改数据库中的现有数据集。 每个输入记录都被认为是UPDATE语句。 修改了现有的行。如下:
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;
如果记录已经存在于数据库中,那么我们想要更新行,如果记录还不存在,那么我们想要插入行,这样的话,也可以使用allowinsert模式指定-update-mode参数。
此外,如果我们指定了不正确的分隔符,这会导致导出任务失败,抛出ParseExceptions。
代码生成参数
4. 失败的Sqoop Export 原因
Sqoop中的export可能失败的原因有多种,例如:
由于从Hadoop集群到数据库的连接丢失。 要么是由于硬件故障,要么是服务器软件崩溃。
尝试插入一行。 违反了一致性约束。 例如,插入一个重复的主键值。
试图解析HDFS源数据中的不完整或格式不正确的记录
通过尝试使用不正确的分隔符解析记录
由于容量问题。 如内存或磁盘空间不足
5. Sqoop Export中的示例调用
要导出名为bar的表格,Sqoop中的基本导出命令为:
$ sqoop export -connect jdbc:mysql://db.example.com/foo --table bar \ -export-dir / results / bar_data
这个例子采用/ results / bar_data中的文件。 之后将其内容导入到db.example.com上foo数据库的Bar表中。 前提条件是在数据库中目标表必须已经存在。Sqoop执行一组INSERT INTO操作,而不考虑现有内容。
启用验证来导出名为bar的表:
$ sqoop export -connect jdbc:mysql://db.example.com/foo --table bar \ -export-dir / results / bar_data -validate
对于/ results / bar_data中的每个记录,调用名为barproc的存储过程的导出,如下所示:
$ sqoop export -connect jdbc:mysql://db.example.com/foo -call barproc \ -export-dir / results / bar_data