返回 导航

大数据

hangge.com

Sqoop - 数据库离线数据采集工具使用详解3(样例2:HDFS数据导出到Mysql)

作者:hangge | 2024-04-10 09:56

三、实现将 HDFS 数据导出至 Mysql

1,准备工作

(1)为了演示如何将 HDFS 数据导出到Mysql中,首先我们在 MySQL 中创建一张 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)下面命令使用 SqoopHDFS 中的数据导出到表 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'

(2)控制台输出如下内容说明任务执行完毕:

(3)查看数据库 user2 表,可以看到数据已经导入进来了:

3,插入(新增)或更新功能

(1)在数据导出时还可以实现插入(新增)或更新功能。如果数据存在则更新,如果数据不存在则插入。假设我们对 user2 表进行如下修改,删除了 id 34 的记录,修改1和2的数据内容,并且增加了一条 id100 的记录。

(2)执行下面 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' \
--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)

回到顶部