这节课其实在讲什么

课名叫「调试 MySQL」,但真正的内容是 Hadoop 的 输入输出格式(InputFormat / OutputFormat)体系,以及它如何对接关系型数据库。许多学 Hadoop 的人卡在这里:能跑通 WordCount,能处理 HDFS 上的文本文件,但一遇到「从数据库读数据」「把计算结果写回数据库」就无从下手。这门课解决的就是这个缺口——不是教 MySQL 本身,而是讲 MapReduce 框架如何把数据库当作数据源和数据汇。

适合什么基础?你需要先会写基本的 MapReduce 程序,知道 Mapper、Reducer、Job 怎么配置,并且懂一点 SQL(SELECT、INSERT、WHERE、ORDER BY 足够)。如果连 MapReduce 的作业流程都不熟,建议先回去补,再来看这节课。如果你已经能处理纯文本文件,但对 InputFormat 的理解停留在「默认 TextInputFormat」这一步,那这节课正好帮你补上内部机制。

建议按这个顺序看,边看边问

第一段先看「输入格式总览」。不要急着碰数据库,先理解 InputFormat 的三个职责:切分输入数据、读取记录、把记录解析成 key-value 对。这里会讲到 reader 和 output-writer 的角色分工,这是后面所有讨论的地基。看完这一段,你应该能回答:为什么需要自定义 InputFormat?默认实现解决不了什么问题?

第二段看 DBInputFormat 的用法。它解决的是「如何用 SQL 查询结果作为 MapReduce 的输入」——注意不是把整个表导成文件再处理,而是直接通过 JDBC 读。要重点搞清楚三件事:查询语句的边界条件(如 WHERE 子句)怎么控制数据分片、split 的数量与数据库连接的关系、以及 map 任务并行度由什么决定。看完后试着回答:如果一个表有 100 万行,MapReduce 默认会起多少个 map 任务去读它?

第三段是 DBInputFormat 的内部代码走读。这一段最枯燥,但价值在于它把「框架机制」和「实际代码」对应起来。看到 getSplits 和 RecordReader 的实现时,你要主动对比一下:数据库分片和 HDFS 文件分片有什么本质区别?为什么数据库输入不能简单地按字节切分?这里建议配合断点调试,动手去追一遍执行流程,而不是只看代码。

第四段讲 DBOutputFormat,即把计算结果写回 MySQL。和输入不同,写回数据库涉及事务、批量提交、字段映射,这些细节在代码里体现得很具体。你要弄清楚:一个 reduce 输出如何映射成一条 INSERT 语句?输出表需要预先建好吗?批次大小对性能有什么影响?

学完以后你能独立做什么

学完并能复现,你应该能完成这样一件事:从 MySQL 的一张订单表里,按日期范围和状态条件读取数据,用 MapReduce 做统计(比如按用户聚合消费金额),再把结果写入另一张汇总表。整个过程不导出中间文件,不手工切割数据。更进一步,你能理解为什么某些场景下用 DBInputFormat 并不合适(比如大表全量扫描、高并发访问数据库),从而在架构选

课程目录

1 Hadoop第14天-001.输入格式-reader-output-writer分析 (39:29)
2 Hadoop第14天-002.DBInputFormat操纵MySQL数据库 (01:02:12)
3 Hadoop第14天-003.Inputformat内部代码分析-DBInputFormat (46:03)
4 Hadoop第14天-004.DBOutputFormat-数据库记录写入 (53:52)