Sqoop Intro... 2 Sqoop Tools... 2 Sqoop 可 用 工具... 3 Sqoop-import... 3 Common arguments... 4 Validation arguments More Details... 4 Import control arguments... 5 Parameters for overriding mapping... 6 Incremental import arguments... 6 Output line formatting arguments... 6 Input parsing arguments... 6 Hive arguments... 7 语法样例例... 7 Sqoop-import-all-tables... 8 语法样例例... 9 Sqoop-export... 9 Export control arguments... 10 INSERT vs UPDATE... 10 语法样例例... 11 Sqoop-eval... 11 SQL evaluation arguments... 11 语法样例例... 11 Sqoop-list-databases... 12 语法样例例... 12 Sqoop-list-tables... 12 语法样例例... 12 其他... 12
Sqoop Intro Sqoop 工具是设计 用于在传统关系型数据库 (RDBMS) 或者 大型机 (mainframe) 与 Hadoop 平台之间做数据传输 你可以使 用 Sqoop 从关系型数据库如 Oracle MySQL, 通过 MapReduce 框架, 将其导 入数据到 Hadoop 分布式 文件系统, 之后再导出数据到关系型数据库 Sqoop Tools Sqoop 是 一组相关 工具的集合 使 用 Sqoop, 需要指定 工具名称和相关 工具参数 sqoop tool-name [tool-arguments]
Sqoop 可 用 工具 codegen create-hive-table eval export help 生成与数据库记录交互的代码 往 hive 中导 入表定义 执 行行 一条 SQL 语句句并显示结果 将 一个 HDFS 目录的内容导出到 一张数据库表中 列列出可 用的命令 import 将 一张表的内容从数据库导 入到 HDFS 中 import-all-tables 将 一个数据库的所有表导 入到 HDFS 中 import-mainframe 将 大型机的数据集导 入到 HDFS 中 job list-databases list-tables merge metastore version 工作于已保存的作业 列列出 一台服务器器上所有可 用的数据库 列列出 一个数据库中所有可 用的表 将增量量导 入的结果进 行行合并 运 行行 一个独 立的元数据库 显示版本信息 如果希望查询具体 工具的帮助信息, 可以使 用类似以下的命令 sqoop help codegen Sqoop-import Import 工具, 将 一张单独的表从 RDBMS 中导 入到 HDFS 表中的每 行行数据, 在 HDFS 中显示为每 一条单独的记录 记录可以保存为 文本 文件 ( 一 行行 一条记录 ), 或者为 二进制 文件, 如 Avro 或者 SequenceFiles
Common arguments --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> --relaxed-isolation 设定认证密码 设定认证 用户 作业 工作时打印更更多的详细信息 设定 一个包含 JDBC 连接串串参数的属性 文件 可选, 替代在命令 行行中输 入连接串串信息 设置连接的事务隔离, 可以为 mapper 做未提交读 Validation arguments More Details --validate --validator <class-name> --validation-threshold <class-name> --validationfailurehandler <classname> 启动数据复制的校验功能, 仅 支持单表拷 贝 指定使 用的校验器器的类 指定使 用的校验器器阈值的类 指定使 用的校验器器错误处理理的类
Import control arguments --append --as-avrodatafile --as-sequencefile 往 HDFS 中已存在的 目录中添加数据 导 入的数据保存为 Avro 数据 文件 导 入的数据保存为 SequenceFiles 文件 --as-textfile 导 入的数据保存为平 面 文件 ( 默认 ) --as-parquetfile --boundary-query <statement> --columns <col,col,col > --delete-target-dir --direct --fetch-size <n> --inline-lob-limit <n> -m,--num-mappers <n> -e,--query <statement> --split-by <columnname> --autoreset-to-onemapper --table <table-name> --target-dir <dir> --warehouse-dir <dir> --where <where clause> -z,--compress 导 入的数据保存为 Parquet 文件 边界查询 用于创建分割 具体来说, 根据指定的字段, 查询其最 大最 小值, 用来决定 import 的并发数 指定表中需要导 入的具体字段 Import 时不不指定该参数, 将导 入全部字段 导 入过程中, 删除已存在的 目标 目录 如果数据库 支持, 采 用直连的 方式连接数据库 从数据库 一次性读取多 大的实体数量量 为 一个内联的 LOB 大 小设置最 大值 使 用 N 个 map 进 行行并发导 入 导 入 SQL 语句句查询的结果集 指定 用于分割 工作单元的字段 字段 一般为表的主键 不不能与 --autoreset-to-one-mapper 同时使 用 当表不不存在主键, 也没有提供 用于分割 工作单元的字段时, 考虑使 用该参数 不不能与 --split-by 同时使 用 表名 指定 HDFS 的 目标 目录 指定 HDFS 目标的 父级 目录 导 入过程中指定的 where 子句句 启 用压缩 --compression-codec <c> 为 Hadoop 指定压缩 用编码 ( 默认 gzip) --null-string <null-string> --null-non-string <nullstring> 为字符串串字段指定 null 值 如果未指定, 默认 用 null 字符串串表示空值 为 非字符串串字段指定 null 值 如果未指定, 默认 用 null 字符串串表示空值
Parameters for overriding mapping --map-column-java <mapping> --map-column-hive <mapping> 为配置的列列名, 自定义 SQL 到 Java 的数据类型 为配置的列列名, 自定义 SQL 到 hive 的数据类型 Incremental import arguments --check-column (col) --incremental (mode) --last-value (value) 指定待检查的列列, 用于决定是否导 入的依据 不不能指定数据类型为字符串串 (CHAR/NCHAR/VARCHAR/VARNCHAR/ LONGVARCHAR/LONGNVARCHAR) 的字段 指定 sqoop 以何种 方法识别新的数据 有效模式分别是 append 和 lastmodified 两种 指定前次导 入时, 检查列列的最 大值 Output line formatting arguments Output 指数据保存在 HDFS 上的格式 --enclosed-by 设置字段封闭符 --escaped-by --fields-terminated-by --lines-terminated-by --mysql-delimiters --optionally-enclosed-by 设置转义符 设置字段分隔符 设置 行行分隔符 使 用 MySQL 默认的分隔符设置 :fields:, lines: \n escapedby: \ optionally-enclosed-by: ' 设置可选的封闭符 Input parsing arguments 指输 入流的数据格式
--input-enclosed-by --input-escaped-by --input-fieldsterminated-by --input-lines-terminatedby --input-optionallyenclosed-by 设置输 入字段的封闭符 设置输 入流的转义符 设置输 入流的字段分隔符 设置输 入流的 行行分隔符 设置输 入流的可选封闭符 Hive arguments --hive-home <dir> --hive-import --hive-overwrite --create-hive-table --hive-table <tablename> --hive-drop-importdelims --hive-delimsreplacement --hive-partition-key --hive-partition-value <v> --map-column-hive <map> 使 用 自定义 目录路路径, 覆盖 $HIVE_HOME 全局变量量 将表导 入 hive( 如果没有指定分隔符, 则使 用 hive 的默认设置 ) 覆盖 hive 表中已存在的数据 创建 hive 表, 如果设置该参数, 那么当 hive 中已经存在相应表时, 作业会失败 默认不不开启该参数 设置导 入 hive 时的表名 导 入 hive 时, 从字符串串字段中丢弃 \n \r 和 \01 字符 导 入 hive 时, 从字符串串字段中将 \n \r 和 \01 字符替换成 用户指定的字符 指定 hive 表的分区键 指定本次作业中,hive 表的分区键的值 为配置的列列名, 自定义 SQL 到 hive 的数据类型 语法样例例 一个基本导 入操作, 将 crop 数据库中 employee 表导 入 sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES 一个包含登录的导 入
--username SomeUser -P Enter password: (hidden) 从 employee 表中选择指定的字段 --columns "employee_id,first_name,last_name,job_title" 控制导 入过程的并发度 ( 指定 8 个并 行行任务 ) -m 8 将数据保存成 SequenceFiles, 并设置已 生成的类名 com.foocorp.employee --class-name com.foocorp.employee --as-sequencefile 在 文本模式导 入中, 指定分隔符 --fields-terminated-by '\t' --lines-terminated-by '\n' \ --optionally-enclosed-by '\"' 将数据导 入进 hive --hive-import 只导 入新 用户 --where "start_date > '2010-01-01'" 改变默认的分割字段 --split-by dept_id 执 行行对新数据的增量量导 入, 之前已导 入表中的前 10 万数据 sqoop import --connect jdbc:mysql://db.foo.com/somedb --table sometable \ --where "id > 100000" --target-dir /incremental_dataset --append 对导 入的表进 行行校验, 校验表中的记录数和已复制到 HDFS 中的记录 行行数 sqoop import --connect jdbc:mysql://db.foo.com/corp \ --table EMPLOYEES --validate Sqoop-import-all-tables Sqoop-import-all-tables 是从 RDBMS 中将 一组表导 入到 HDFS 的 工具 每张表的数据在 HDFS 中都会以单独 文件夹保存 要使 用 Sqoop-import-all-tables 工具, 必须符合以下条件 : 每张表都必须有 一个主键, 否则必须使 用 --autoreset-to-one-mapper 参数 必须导 入每张表的所有字段 不不能为表指定 非默认的分割字段 ( 即主键以外的字段 ), 也不不能通过 where 子句句添加任何条件
Sqoop-import-all-tables 在参数设置上与 sqoop-import 工具基本 一致, 但 --table, --splitby, --columns 和 --where 参数对 Sqoop-import-all-tables 无效 另外,--exclude-tables 参数仅能在 Sqoop-import-all-tables 中使 用 语法样例例 导 入 crop 数据库中所有表 sqoop import-all-tables --connect jdbc:mysql://db.foo.com/corp Sqoop-export Sqoop-export 工具, 是 用来将 HDFS 上 一组数据导出到 RDBMS 中 数据库中的 目标表必须已经存在 HDFS 上输 入 文件会被读取, 并根据 用户指定的分隔符进 行行解析和 生成 一组对应的记录 默认的操作是将这些源数据转换成 一组 INSERT 语句句, 用以将记录插 入到数据库中 在 UPDATE MODE 中,Sqoop 将会 生成 UPDATE 语句句 用来替换数据库中已经存在的记录 而在 CALL MODE 中,Sqoop 将会为每条记录调 用数据库中的存储过程
Export control arguments --columns <col,col,col > --direct --export-dir <dir> -m,--num-mappers <n> --table <table-name> --call <stored-procname> --update-key <col-name> --update-mode <mode> --input-null-string <nullstring> --input-null-non-string <null-string> --staging-table <stagingtable-name> --clear-staging-table --batch 指定导出到表的字段 使 用直连快速导出的 方式 指定导出源的 HDFS 路路径 指定并 行行导出时的并 行行度 指定导出的 目标表名 调 用存储过程 指定 用于做更更新的固定字段 如果是多个字段组合, 可以 用, 逗号进 行行排列列 指定更更新模式 有效值为 updateonly( 默认 ) 和 allowinsert 指定字符串串字段的空值字符 指定 非字符串串字段的空值字符 指定 一张临时表 数据会 首先加载到临时表, 在插 入到 目标表 是否清理理临时表中已有的数据 为底层的执 行行语句句使 用批处理理模式 INSERT vs UPDATE 默认情况下,sqoop-export 会附加记录到 目标表 ; 每 一 行行输 入记录将会转换为 INSERT 语句句, 以便便为 目标数据库表添加 行行数 如果表拥有约束 ( 如主键约束 ) 并包含了了数据, 那么必须 小 心对待这些插 入语句句, 避免违反约束规则 如果 INSERT 语句句失败, 那么导出进程也会失败 这种模式的主要意图是将数据导出到 一张新的 空的表中 如果指定 --update-key 参数,sqoop 将会修改数据库中已存在的数据集 每 一 行行输 入记录将被对待为 UPDATE 语句句, 用于修改存在的记录 UDATE 语句句将依据 --update-key 参数指定的字段来决定更更新与否 如果 UPDATE 语句句没有修改任何记录, 这将不不会被考虑为 一个错误, 导出过程将会持续 ( 换句句话说, 基于 UPDATE 模式的导出, 不不会将新数据插 入到数据库中 ) 同样的, 如果 --update-key 指定的字段并 非唯 一的, 那么 一条语句句可能更更新多条记录, 这种情况同样不不会被 sqoop 检测到 指定的 --update-key 参数, 可以 用逗号分隔的多个字段组合 这种情况下,sqoop 只有匹配
上所有的关键字才会更更新存在的记录 根据 目标数据库的情况, 如果你希望在数据库中更更新存在的 行行和插 入未存在的 行行, 那么你可能会为 --update-mode 指定 allowinsert 模式 语法样例例 一个基本的导出操作, 到表 bar sqoop export --connect jdbc:mysql://db.example.com/foo --table bar \ --export-dir /results/bar_data 在导出中为每 行行数据调 用名为 barproc 的存储过程 sqoop export --connect jdbc:mysql://db.example.com/foo --call barproc \ --export-dir /results/bar_data Sqoop-eval Sqoop-eval 工具允许向数据库执 行行 一条简单的查询, 并将结果打印到控制台 这个功能允许 用户预览将要导 入的数据 经实测, 只要是有效的 SQL 查询语句句都可以通过该 工具执 行行, 如 UPDATE INSERT DELETE TRUNCATE 等操作 所以官 网特此警告不不要将该 工具 用于 生产环境 SQL evaluation arguments -e,--query <statement> 执 行行 一条 SQL 语句句 语法样例例 从 employee 表中查询 10 条语句句 sqoop eval --connect jdbc:mysql://db.example.com/corp \ --query "SELECT * FROM employees LIMIT 10" 往 foo 表中插 入 一条记录 sqoop eval --connect jdbc:mysql://db.example.com/corp \ -e "INSERT INTO foo VALUES(42, 'bar')"
Sqoop-list-databases 该 工具 用于列列出 一台数据库服务器器上所有的数据库模式 语法样例例 列列出 MySQL 服务器器上的所有数据库模式 sqoop list-databases --connect jdbc:mysql://database.example.com/ information_schema employees Sqoop-list-tables 该 工具类似 sqoop-list-databases 工具, 用于列列出数据库中的所有表 语法样例例 列列出 crop 数据库中的所有表 sqoop list-tables --connect jdbc:mysql://database.example.com/corp employees payroll_checks job_descriptions office_supplies 通过 --schema 参数, 列列出指定模式下的所有表 sqoop list-tables --connect jdbc:postgresql://localhost/corp --username name -P -- --schema payrolldept employees expenses 其他 本 文仅阐述了了 工作中常 用的 sqoop 功能与 方法, 诸如其他的 一些特性和 方法, 如 HBASE 相关 HCATALOG 集成, 请 自 行行前往官 网查询 http://sqoop.apache.org/docs/1.4.6/sqoopuserguide.html