当前位置:首页 >> 计算机软件及应用 >>

Sqoop1工具import和export使用详解

Sqoop 工具 import 和 export 使用详解
问题导读: 1、Sqoop 如何在异构平台之间进行数据迁移 ? 2、Sqoop 是怎样保证高可靠性的 ?

Sqoop 可以在 HDFS/Hive 和关系型数据库之间进行数据的导入导出, 其中主要使用了 import 和 export 这两个工具。这两个工具非常强大,提供了很多选项帮助我们完成数据的迁移和 同步。比如,下面两个潜在的需求: 1. 业务数据存放在关系数据库中,如果数据量达到一定规模后需要对其进行分析或同 统计,单纯使用关系数据库可能会成为瓶颈,这时可以将数据从业务数据库数据导 入(import)到 Hadoop 平台进行离线分析。 2. 对大规模的数据在 Hadoop 平台上进行分析以后,可能需要将结果同步到关系数据 库中作为业务的辅助数据,这时候需要将 Hadoop 平台分析后的数据导出(export) 到关系数据库。 这里,我们介绍 Sqoop 完成上述基本应用场景所使用的 import 和 export 工具,通过一些简 单的例子来说明这两个工具是如何做到的。

工具通用选项
import 和 export 工具有些通用的选项,如下表所示: 选项 --connect <jdbc-uri> --connection-manager <class-name> --driver <class-name> --hadoop-mapred-home <dir> --help --password-file 指定 JDBC 连接字符串 指定要使用的连接管理器类 指定要使用的 JDBC 驱动类 指定$HADOOP_MAPRED_HOME 路径 打印用法帮助信息 设置用于存放认证的密码信息文件的路径 含义说明

-P --password <password> --username <username> --verbose --connection-param-file <filename>

从控制台读取输入的密码 设置认证密码 设置认证用户名 打印详细的运行信息 可选,指定存储数据库连接参数的属性文件

数据导入工具 import
import 工具, 是将 HDFS 平台外部的结构化存储系统中的数据导入到 Hadoop 平台,便于后 续分析。我们先看一下 import 工具的基本选项及其含义,如下表所示: 选项 --append --as-avrodatafile --as-sequencefile --as-textfile --boundary-query <statement> --columns <col,col,col…> --delete-target-dir --direct --direct-split-size <n> --fetch-size <n> --inline-lob-limit <n> -m,--num-mappers <n> -e,--query <statement> --split-by <column-name> --table <table-name> --target-dir <dir> --warehouse-dir <dir> --where <where clause> 含义说明 将数据追加到 HDFS 上一个已存在的数据集上 将数据导入到 Avro 数据文件 将数据导入到 SequenceFile 将数据导入到普通文本文件(默认) 边界查询,用于创建分片(InputSplit) 从表中导出指定的一组列的数据 如果指定目录存在,则先删除掉 使用直接导入模式(优化导入速度) 分割输入 stream 的字节大小(在直接导入模式下) 从数据库中批量读取记录数 设置内联的 LOB 对象的大小 使用 n 个 map 任务并行导入数据 导入的查询语句 指定按照哪个列去分割数据 导入的源表表名 导入 HDFS 的目标路径 HDFS 存放表的根路径 指定导出时所使用的查询条件

-z,--compress --compression-codec <c> --null-string <null-string> --null-non-string <null-string>

启用压缩 指定 Hadoop 的 codec 方式(默认 gzip) 果指定列为字符串类型,使用指定字符串替换值为 null 的该类列的值 如果指定列为非字符串类型,使用指定字符串替换值为 null 的该类列的值

下面,我们通过实例来说明,在实际中如何使用这些选项。 将 MySQL 数据库中整个表数据导入到 Hive 表
1. bin/sqoop import --connect jdbc:mysql://10.95.3.49:3306/workflow --table project --username shirdrn -P --hive-import --default-character-set=utf-8 复制代码 --

将 MySQL 数据库 workflow 中 project 表的数据导入到 Hive 表中。 将 MySQL 数据库中多表 JION 后的数据导入到 HDFS

1. bin/sqoop import --connect jdbc:mysql://10.95.3.49:3306/workflow --username shirdrn -P --query 'SELECT users.*, tags.tag FROM users JOIN tags ON (users.id = tags.user_id) WHERE $CONDITIONS' --split-by users.id --target-dir /hive/tag_db/user_tags 复制代码 -- --default-character-set=utf-8

这里,使用了--query 选项,不能同时与--table 选项使用。而且,变量$CONDITIONS 必须 在 WHERE 语句之后,供 Sqoop 进程运行命令过程中使用。上面的--target-dir 指向的其实 就是 Hive 表存储的数据目录。 将 MySQL 数据库中某个表的数据增量同步到 Hive 表
1. bin/sqoop job --create your-sync-job -- import --connect jdbc:mysql://10.95.3.49:3306/workflow --table project --username shirdrn -P --hive-import --incremental append --check-column id --last-value 1 ---default-character-set=utf-8 复制代码

这里,每次运行增量导入到 Hive 表之前,都要修改--last-value 的值,否则 Hive 表中会出 现重复记录。 将 MySQL 数据库中某个表的几个字段的数据导入到 Hive 表
1. bin/sqoop import --connect jdbc:mysql://10.95.3.49:3306/workflow --username shirdrn --P --table tags --columns 'id,tag' --create-hive-table -target-dir

/hive/tag_db/tags -m 1 --hive-table tags --hive-import ---default-character-set=utf-8 复制代码

我们这里将 MySQL 数据库 workflow 中 tags 表的 id 和 tag 字段的值导入到 Hive 表 tag_db.tags。其中--create-hive-table 选项会自动创建 Hive 表,--hive-import 选项会将选 择的指定列的数据导入到 Hive 表。如果在 Hive 中通过 SHOW TABLES 无法看到导入的表, 可以在 conf/hive-site.xml 中显式修改如下配置选项:
1. <property> 2. 3. ue> 4. </property> 5. 复制代码 <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=hive_metastore_db;create=true</val

然后再重新运行,就能看到了。 使用验证配置选项
1. sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES --validate --validator org.apache.sqoop.validation.RowCountValidator --validation-threshold org.apache.sqoop.validation.AbsoluteValidationThreshold --validation-failurehandler org.apache.sqoop.validation.AbortOnFailureHandler 复制代码

上面这个是官方用户手册上给出的用法,我们在实际中还没用过这个,有感兴趣的可以验证 尝试一下。

数据导出工具 export
export 工具,是将 HDFS 平台的数据,导出到外部的结构化存储系统中,可能会为一些应用 系统提供数据支持。我们看一下 export 工具的基本选项及其含义,如下表所示: 选项 --validate <class-name> --validation-threshold <class-name> --direct --export-dir <dir> -m,--num-mappers <n> --table <table-name> --call <stored-proc-name> --update-key <col-name> --update-mode <mode> --input-null-string <null-string> --input-null-non-string <null-string> --staging-table <staging-table-name> --clear-staging-table --batch 含义说明

启用数据副本验证功能,仅支持单表拷贝,可以指定验证使用的实现 指定验证门限所使用的类 使用直接导出模式(优化速度) 导出过程中 HDFS 源路径 使用 n 个 map 任务并行导出 导出的目的表名称 导出数据调用的指定存储过程名 更新参考的列名称,多个列名使用逗号分隔 指定更新策略,包括:updateonly(默认)、allowinsert 使用指定字符串,替换字符串类型值为 null 的列 使用指定字符串,替换非字符串类型值为 null 的列 在数据导出到数据库之前,数据临时存放的表名称 清除工作区中临时存放的数据 使用批量模式导出

下面,我们通过实例来说明,在实际中如何使用这些选项。这里,我们主要结合一个实例, 讲解如何将 Hive 中的数据导入到 MySQL 数据库。 首先,我们准备几个表,MySQL 数据库为 tag_db,里面有两个表,定义如下所示:

1. CREATE TABLE tag_db.users ( 2. 3. 4. id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, PRIMARY KEY (`id`)

5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 6. 7. 8. CREATE TABLE tag_db.tags (

9. 10. 11. 12.

id INT(11) NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, tag VARCHAR(100) NOT NULL, PRIMARY KEY (`id`)

13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 14. 15. 复制代码

这两个表中存储的是基础数据,同时对应着 Hive 中如下两个表:

1. CREATE TABLE users ( 2. 3. id INT, name STRING

4. ); 5. 6. CREATE TABLE tags ( 7. 8. 9. id INT, user_id INT, tag STRING

10. ); 11. 复制代码

我们首先在上述 MySQL 的两个表中插入一些测试数据:

1. INSERT INTO tag_db.users(name) VALUES('jeffery'); 2. INSERT INTO tag_db.users(name) VALUES('shirdrn'); 3. INSERT INTO tag_db.users(name) VALUES('sulee'); 4. 5. INSERT INTO tag_db.tags(user_id, tag) VALUES(1, 'Music'); 6. INSERT INTO tag_db.tags(user_id, tag) VALUES(1, 'Programming'); 7. INSERT INTO tag_db.tags(user_id, tag) VALUES(2, 'Travel');

8. INSERT INTO tag_db.tags(user_id, tag) VALUES(3, 'Sport'); 9. 复制代码

然后,使用 Sqoop 的 import 工具,将 MySQL 两个表中的数据导入到 Hive 表,执行如下命 令行:

1. bin/sqoop import --connect jdbc:mysql://10.95.3.49:3306/tag_db --table users --username shirdrn -P --hive-import -- --default-character-set=utf-8 2. 3. bin/sqoop import --connect jdbc:mysql://10.95.3.49:3306/tag_db --table tags --username shirdrn -P --hive-import -- --default-character-set=utf-8 复制代码

导入成功以后,再在 Hive 中创建一个用来存储 users 和 tags 关联后数据的表:

1. CREATE TABLE user_tags ( 2. 3. 4. id STRING, name STRING, tag STRING

5. ); 6. 复制代码

执行如下 HQL 语句,将关联数据插入 user_tags 表:

1. FROM users u JOIN tags t ON u.id=t.user_id INSERT INTO TABLE user_tags SELECT CONCAT(CAST(u.id AS STRING), CAST(t.id AS STRING)), u.name, t.tag; 复制代码

将 users.id 与 tags.id 拼接的字符串,作为新表的唯一字段 id,name 是用户名,tag 是标签名 称。 再在 MySQL 中创建一个对应的 user_tags 表,如下所示:

1. CREATE TABLE tag_db.user_tags ( 2. id varchar(200) NOT NULL,

3. 4.

name varchar(100) NOT NULL, tag varchar(100) NOT NULL

5. ); 6. 复制代码

使用 Sqoop 的 export 工具, 将 Hive 表 user_tags 的数据同步到 MySQL 表 tag_db.user_tags 中, 执行如下命令行:

1. bin/sqoop export --connect jdbc:mysql://10.95.3.49:3306/tag_db --username shirdrn --P --table user_tags --export-dir /hive/user_tags --input-fields-terminated-by '\001' -- --default-character-set=utf-8 复制代码

执行导出成功后,可以在 MySQL 的 tag_db.user_tags 表中看到对应的数据。 如果在导出的时候出现类似如下的错误:

1. 14/02/27 17:59:06 INFO mapred.JobClient: Task Id : attempt_201402260008_0057_m_000001_0, Status : FAILED 2. java.io.IOException: Can't export data, please check task tracker logs 3. at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:1 12) 4. at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:3 9) 5. 6. at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145) at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.ja va:64) 7. 8. 9. 10. 11. at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364) at org.apache.hadoop.mapred.Child$4.run(Child.java:255) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396)

12.

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformati on.java:1190)

13.

at org.apache.hadoop.mapred.Child.main(Child.java:249)

14. Caused by: java.util.NoSuchElementException 15. 16. 17. 18. at java.util.AbstractList$Itr.next(AbstractList.java:350) at user_tags.__loadFromFields(user_tags.java:225) at user_tags.parse(user_tags.java:174) at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:8 3) 19. 20. 复制代码 ... 10 more

通过指定字段分隔符选项--input-fields-terminated-by, 指定 Hive 中表字段之间使用的分隔符, 供 Sqoop 读取解析,就不会报错了。

附网上的导入命令参考:

Sqoop Import Examples: Sqoop Import :- Import data from a relational database management system (RDBMS) such as MySQL or Oracle into the Hadoop Distributed File System (HDFS) and its subprojects (Hive, HBase).

Import the data (MySQL table) to HBase:

Case 1: If table have primary key and import all the column of MySQL table into HBase table.

$ bin/sqoop import --connect jdbc:mysql://localhost/db1 --username root --password root --table tableName --hbase-table hbase_tableName --column-family hbase_table_col1 --hbase-create-table

Case 2: If table have primary key and import only few columns of MySQL table into HBase table.

$ bin/sqoop import --connect jdbc:mysql://localhost/db1 --username root --password root --table tableName --hbase-table hbase_tableName --columns column1,column2 --column-family hbase_table_col1 --hbase-create-table

Note : Column names specified in --columns attribute must contain the primary key column.

Case 3: If table doesn't have primary key then choose one column as a hbase-row-key. Import all the column of MySQL table into HBase table.

$ bin/sqoop import --connect jdbc:mysql://localhost/db1 --username root --password root --table tableName --hbase-table hbase_tableName --column-family hbase_table_col1 --hbase-row-key column1 --hbase-create-table

Case 4: If table doesn't have primary key then choose one column as a hbase-row-key. Import only few columns of MySQL table into HBase table.

$ bin/sqoop import --connect jdbc:mysql://localhost/db1 --username root --password root --table tableName --hbase-table hbase_tableName --columns column1,column2 --column-family hbase_table_col --hbase-row-key column1 --hbase-create-table

Note: Column name specified in hbase-row-key atribute must be in columns list. Otherwise command will execute successfully but no records are inserted into hbase.

Note : The value of primary key column or column specified in --hbase-row-key attribute become the HBase row value. If MySQL table doesn't have primary key or column specified in --hbase-row-key attribute doesn't have unique value then there is a lost of few records.

Example : Let us consider a MySQL table test_table which have two columns name,address. The table test_table doesn't have primary key or unique key column.

Records of test_table: ________________ name address

---------------abc sqw abc sdf aql 123 345 125 1234 23dw

Run the following command to import test_table data into HBase:

$ bin/sqoop import --connect jdbc:mysql://localhost/db1 --username root --password root --table test_table --hbase-table hbase_test_table --column-family test_table_col1 --hbase-row-key name --hbase-create-table

Only 4 records are visible into HBase table instead of 5. In above example two rows have same value 'abc' of name column and value of this column is used as a HBase row key value. If record having value 'abc' of name column come then thoes record will inserted into HBase table. Next time, another record having the same value 'abc' of name column come then thoes column will overwrite the value previous column.

Above problem also occured if table have composite primary key because the one column from composite key is used as a HBase row key.

Import the data (MySQL table) to Hive

Case 1: Import MySQL table into Hive if table have primary key.

bin/sqoop-import --connect jdbc:mysql://localhost:3306/db1 -username root -password password --table tableName --hive-table tableName --create-hive-table --hive-import --hive-home path/to/hive_home

Case 2: Import MySQL table into Hive if table doesn't have primary key.

$ bin/sqoop-import --connect jdbc:mysql://localhost:3306/db1 -username root -password password --table tableName --hive-table tableName --create-hive-table --hive-import --hive-home path/to/hive_home --split-by column_name

or

$ bin/sqoop-import --connect jdbc:mysql://localhost:3306/db1 -username root -password password --table tableName --hive-table tableName --create-hive-table --hive-import --hive-home path/to/hive_home -m 1

Import the data (MySQL table) to HDFS

Case 1: Import MySQL table into HDFS if table have primary key.

$ bin/sqoop import -connect jdbc:mysql://localhost:3306/db1 -username root -password password --table tableName --target-dir /user/ankit/tableName

Case 2: Import MySQL table into HDFS if table doesn't have primary key.

$ bin/sqoop import -connect jdbc:mysql://localhost:3306/db1 -username root -password password --table tableName --target-dir /user/ankit/tableName -m 1

Sqoop Export Examples:

Sqoop Export: export the HDFS and its subproject (Hive, HBase) data back into an RDBMS.

Export Hive table back to an RDBMS:

By default, Hive will stored data using ^A as a field delimiter and \n as a row delimiter.

$ bin/sqoop export --connect jdbc:mysql://localhost/test_db --table tableName --export-dir /user/hive/warehouse/tableName --username root --password password -m 1 --input-fields-terminated-by '\001'

where '\001' is octal representation of ^A.


相关文章:
sqoop使用手册.doc
Author :路帅 1. Sqoop 介绍 概述 Hadoop 的数据传输工具 sqoop 是 Apache ...Sqoop 工具 import 和 export 使用详解 Sqoop 可以在 HDFS/Hive/Hbase 和关系...
sqoop详细教程.doc
//sqoop.apache.org/ 目前为止,已经演化出了 2 个版本:sqoop1 和 sqoop2。...export 选项: --direct 直接使用 mysqlimport 工具导入 mysql --export-dir ...
使用sqoop工具进行数据表增量导入.doc
使用sqoop工具进行数据表增量导入_计算机软件及应用_IT...sqoop export connect jdbc:mysql://localhost:...1)设置 Input DataDrivenImportJob.configureInput...
sqoop使用文档_图文.doc
和关系型数据库中的数据相互转移的工具, 可以 将一...1.2 使用 #指定列 $ sqoop import --connect jdbc...5. export 从 hdfs 中导数据到关系数据库中 sqoop...
import&export practice1_图文.ppt
import&export practice1_经管营销_专业资料。进出口...所交货物的品质,既要完全符合文字说明,又 要样品...交至买方指定的承运人或装上买方指定的运输工具。 ...
Sqoop官方中文手册.doc
Sqoop 中文手册 1. 概述本文档主要对 SQOOP使用...export-dir sqoop/test 参数 说明 direct 快速...库的导入工具, 如 mysql 的 mysqlimport, 可以比 ...
Sqoop中文手册.doc
Sqoop 中文手册 8,455 浏览 1 条回复 子猴: ...这可以使得在使用 import 这种工具进 行数据导入的...export-dir sqoop/test 参数 说明 direct 快速...
oracle的Export、Import详解.doc
oracle的ExportImport详解_IT/计算机_专业资料。oracle的ExportImport详解。备份、恢复 1,Export/Import 的用处 Oracle Export/Import 工具用于在数据库之间传递...
Sqoop开发者指南.doc
6.1 外部 API Sqoop 在执行的时候自动生成将关系型数据库里表导入(import)到...10 JobBase 本身就是 ImportJobBase 和 ExportJobBase 的子集,为特定的配置 ...
Sqoop数据抽取_v1_图文.pdf
将Hadoop和关系型数据库中的数据相互转移的工具 可以...SQOOP import 1.获取元信息 MAP RDBMS MAP Sqoop...SQOOP export 1.获取元信息 MAP RDBMS MAP Sqoop...
ExportImport问题解决方法.txt
CAD中以DXF格式保存; 7、导入到PADS Layout中; 8、用相关的测量工具验证导入...ExportImport 使用技巧... 5页 免费 解决方法 暂无评价 1页 免费 ...
WinCC入门-工具之TAG Export Import_图文.doc
下面附两张变量属性视图: 组态说明 WinCC 变量可以使用 Smart Tools “Variables Import/Export” (VarExim.exe) 软件工具和 “Configuration Tool” 软件工具进行...
数据收集与入库系统Flume与Sqoop.pdf
PostgreSQL Sqoop1架构 Sqoop1架构 Sqoop import ??...Sqoop Export使用方法 sqoop export \ --connect ...是一个关系型数据库与Hadoop间的数据同 步的工具ü...
Tag export import含义.txt
Tag export import含义 - 此工具为WINCC自带的Smart Tools中的工具 变量导出/导入(varexim.exe) 1.简要说明工具软件程序从打开的项目中将所...
INFORMIX的dbexport和dbimport使用示例说明.doc
INFORMIX的dbexport和dbimport使用示例说明_四年级数学...1、导出,首先创建导出个目录,示例中在/db/目录...需要利用工具(如 sqleditor)来验证下脚本 的语法...
sqoop详细教程.doc
sqoop1 的最新版本是 1.4.5,sqoop2 的最新版本是 1.99.3;1.99.3 和 1.4....export 选项: --direct 直接使用 mysqlimport 工具导入 mysql --export-dir ...
汇编里 import 和export.doc
和 jmp $ 相同,自己在死循环 IMPORT , 定义表示这是个外部变量的标号, 不是在本程 序定义的 EXPORT ,表示本程序里面用到的变量提供给其他模块调 用的。 ...
4_2.Export和Import的使用-caith.ppt
ExportImport使用ExportImport使用隐藏>> exportimport使用 exportimport使用 ISSUE 1.0 业务与软件产品课程开发室 1 目标 ExportImport 工具的...
使用RangeImportExportFragment导出和导入文本段.doc
使用RangeImportExportFragment导出和导入文本段_计算机...Microsoft Office 2010 提供了你所需要的工具来创建...(1).ImportFragmentFRAGMENT_FILE,False Words(100)...
sqoop命令参数中文手册.doc
pid=4 Sqoop 中文手册 1.概述本文档主要对 SQOOP ...这可以使得在使用 import 这种工具进行数据导入的时候...export-dir sqoop/test 参数 direct 说明 快速...