请描述使用 Apache Sqoop 将 MySQL 表中的数据并行导入到 HDFS 的完整流程,包括并行度控制参数和具体配置方法。
考察说明
考查对 Sqoop 并行导入机制和核心参数的理解
回答思路
- 【回答框架 1】Sqoop 将 MySQL 数据导入 HDFS 时,通过 --split-by 指定切分列,默认使用主键,结合 --num-mappers(或 -m)设置 Map 任务数,实现并行导入。
- 【回答框架 2】并行原理:根据 split-by 列的最大最小值,将数据按 Map 任务数均分为多个区间,每个 Mapper 负责一个区间,各自通过 JDBC 读取并写入 HDFS 的指定目录。
- 【回答框架 3】导入命令示例:sqoop import --connect jdbc:mysql://host/db --table t --target-dir /path --split-by id -m 4。需注意 split-by 列需为数值或可比较类型,且尽量均匀,否则可能导致数据倾斜。
- 【回答框架 4】并行度调节需结合集群资源与 MySQL 连接上限,过高的 Mapper 数可能压垮数据库,需合理设置。
- 【回答框架 5】可使用 --where 过滤或 --query 自定义查询,配合并行导入提高效率。
- 【关键点 1】Sqoop 通过 --split-by 指定切分列,--num-mappers 控制 Map 数,实现并行导入。
- 【关键点 2】默认使用主键作为 split-by 列,数值型列分布更均匀。
- 【关键点 3】数据按切分列值范围均分,每个 Mapper 独立读取数据段并写入 HDFS。
- 【关键点 4】需关注 MySQL 连接数限制和集群资源,避免 Mapper 过多导致性能下降。
- 【关键点 5】使用 --query 时可自定义并行切分逻辑,但需包含 $CONDITIONS。
- 【易错点 1】split-by 列分布不均会导致数据倾斜,部分 Mapper 处理压力过大。
- 【易错点 2】在 MySQL 支持方面,不恰当的 split-by 类型可能报错或导致全表扫描。
- 【易错点 3】并行度设置过高会耗尽数据库连接,甚至引发超时或拒绝服务。