Sqoop - 数据库离线数据采集工具使用详解3(样例2:HDFS数据导出到Mysql)
作者:hangge | 2024-04-10 09:56
三、实现将 HDFS 数据导出至 Mysql
1,准备工作
(1)为了演示如何将 HDFS 数据导出到Mysql中,首先我们在 MySQL 中创建一张 user2 表:
(2)接下来我们要将前文中(点击查看)从 Mysql 导出保存到 HDFS 中 /out1 目录下的文件内容数据,再导入到这张 user2 表中:
CREATE TABLE `user2` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(64) DEFAULT NULL, `phone` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`) );
(2)接下来我们要将前文中(点击查看)从 Mysql 导出保存到 HDFS 中 /out1 目录下的文件内容数据,再导入到这张 user2 表中:
2,数据导出样例
(1)下面命令使用 Sqoop 将 HDFS 中的数据导出到表 user2 中:注意:命令中 --table 参数指定的表名需要手动创建,Sqoop 不会自动创建此表。
sqoop export \ --connect jdbc:mysql://192.168.60.1:3306/hangge?serverTimezone=UTC \ --username root \ --password hangge1234 \ --table user2 \ --export-dir /out1 \ --input-fields-terminated-by '\t'
(3)查看数据库 user2 表,可以看到数据已经导入进来了:
3,插入(新增)或更新功能
(1)在数据导出时还可以实现插入(新增)或更新功能。如果数据存在则更新,如果数据不存在则插入。假设我们对 user2 表进行如下修改,删除了 id 为 3 和 4 的记录,修改1和2的数据内容,并且增加了一条 id 为 100 的记录。
注意:使用该功能表中必须有一个主键字段。
sqoop export \ --connect jdbc:mysql://192.168.60.1:3306/hangge?serverTimezone=UTC \ --username root \ --password hangge1234 \ --table user2 \ --export-dir /out1 \ --input-fields-terminated-by '\t' \ --update-key id \ --update-mode allowinsert
(3)执行完毕后查看 user2 表,会发现对于表中已有的数据实现了更新操作,对于表中没有的数据实现了新增操作。
4,封装 Sqoop 脚本
(1)在工作中使用 Sqoop 时,建议将 Sqoop 的命令写在 Shell 脚本中,否则无法实现命令重用,并且调用也不方便。比如,我们执行如下命令创建一个在 Shell 脚本:
vi sqoop-export-user.sh
(2)脚本内容如下:
#!/bin/bash sqoop export \ --connect jdbc:mysql://192.168.60.1:3306/hangge?serverTimezone=UTC \ --username root \ --password hangge1234 \ --table user2 \ --export-dir /out1 \ --input-fields-terminated-by '\t' \ --update-key id \ --update-mode allowinsert
(3)使用时执行如下命令即可:
./sqoop-export-user.sh
附:Sqoop 常见参数
1,通用参数
参数 | 解释 |
--connect <jdbc-uri> | 指定 JDBC 连接字符串 |
--connection-manager <class-name> | 指定要使用的连接管理器类 |
--driver <class-name> | 指定要使用的 JDBC 驱动类 |
--hadoop-mapred-home <dir> | 指定 HADOOP_MAPRED_HOME 路径 |
--help | 帮助 |
--password-file | 设置用于存放认证的密码信息文件的路径 |
-P | 从控制台读取输入的密码 |
--password <password> | 设置认证密码 |
--username <username> | 设置认证用户名 |
--verbose | 打印详细的运行信息 |
--connection-param-file <filename> | 指定存储数据库连接参数的属性文件 |
2,数据导入相关参数数
参数 | 解释 |
--append | 将数据追加到 HDFS 上一个已存在的数据集中 |
--as-avrodatafile | 将数据导入 Avro 数据文件 |
--as-sequencefile | 将数据导入 SequenceFile |
--as-textfile | 将数据导入普通文本文件(默认) |
--boundary-query <statement> | 边界查询,用于创建分片(InputSplit) |
--columns <col,col,col…> | 从表中导出指定的一组列的数据 |
--delete-target-dir | 如果指定目录存在,则先将其删除 |
--direct | 使用直接导入模式(优化导入速度) |
--direct-split-size <n> | 指定切分输入数据的大小(在直接导入模式下) |
--fetch-size <n> | 从数据库中批量读取记录数 |
--inline-lob-limit <n> | 设置内联的 LOB 对象的大小 |
-m,--num-mappers <n> | 使用 n 个 map 任务并行导入数据 |
-e,--query <statement> | 导入的查询语句 |
--split-by <column-name> | 指定按照哪个列去切分数据 |
--table <table-name> | 导入的源表表名 |
--target-dir <dir> | 导入 HDFS 的目标路径 |
--warehouse-dir <dir> | HDFS 存放表的根路径 |
--where <where clause> | 指定导出时所使用的查询条件 |
-z,--compress | 启用压缩 |
--compression-codec <c> | 指定 Hadoop 的压缩方式(默认为 Gzip) |
--null-string <null-string> | 使用指定字符串,替换字符串类型值为 null 的列 |
--null-non-string <null-string> | 使用指定字符串,替换非字符串类型值为 null 的列 |
3,数据导出相关参数数
参数 | 解释 |
--direct | 使用直接导出模式(优化速度) |
--export-dir <dir> | 导出过程中 HDFS 的源路径 |
--m,--num-mappers <n> | 使用 n 个 map 任务并行导出 |
--table <table-name> | 导出的目的表名称 |
--call <stored-proc-name> | 导出数据调用的指定存储过程名 |
--update-key <col-name> | 更新参考的列名称,多个列名之间使用逗号分隔 |
--update-mode <mode> | 指定更新策略,包括 updateonly(默认)、allowinsert |
--input-null-string <null-string> | 使用指定字符串,替换字符串类型值为 null 的列 |
--input-null-non-string <null-string> | 使用指定字符串,替换非字符串类型值为 null 的列 |
--staging-table <staging-table-name> | 在数据导出到数据库之前,数据临时存放的表名称 |
--clear-staging-table | 清除工作区中临时存放的数据 |
--batch | 使用批量模式导出 |
全部评论(0)