大数据 -11-MapReduce JOIN 操作的 Java 实现 Driver Mapper Reducer 具体实现逻辑 模拟 SQL 进行联表操作

点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI 篇持续更新中!(长期更新)
目前 2025 年 06 月 13 日更新到:AI 炼丹日志-28 - Audiblez 将你的电子书 epub 转换为音频 mp3 做有声书,持续打造实用 AI 工具指南!📐🤖
💻 Java 篇正式开启!(300 篇)
目前 2025 年 06 月 11 日更新到:Java-44 深入浅出 Nginx - 底层进程机制 Master Worker 机制原理 常用指令 MyBatis 已完结,Spring 已完结,深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300 篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!目前 2025 年 06 月 13 日更新到:大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解

章节内容
上一节我们完成了:
MapReduce 的介绍
Hadoop 序列化介绍
Mapper 编写规范
Reducer 编写规范
Driver 编写规范
WordCount 功能开发
WordCount 本地测试
背景介绍
这里是三台公网云服务器,每台 2C4G,搭建一个 Hadoop 的学习环境,供我学习。
2C4G 编号 h121
2C4G 编号 h122
2C2G 编号 h123

MapReduce Reduce-Side Join
这是最通用的 JOIN 方式。Mapper 负责将相同 key 的数据发往同一个 Reducer,由 Reducer 进行 JOIN。
对应特点
可以处理 任意大小的两个数据集
实现相对简单
网络传输量大,效率相对低
实现思路
每个输入记录由 Mapper 输出为 (join_key, record) 形式,并附带一个标记来区分来源(如 “A”, “B”)
Shuffle 阶段会将相同的 key 聚合到同一个 Reducer
Reducer 对 key 下的数据分为 A/B 两类,执行 JOIN 逻辑(如嵌套循环或哈希匹配)
Map-Side Join(映射端 JOIN)
适用于一个数据集很小(可放入内存中),另一个很大时的情况。
对应特点
无需 Shuffle,效率高
前提是小表 可以完全加载到每个 Mapper 的内存中
实现思路
在作业启动前,将小表通过分布式缓存(Distributed Cache)分发到每个 Mapper 节点
Mapper 启动时加载小表到内存,然后大表逐行处理,与内存中的小表匹配 JOIN
Semi-Join(半连接)
用于减少数据传输量,常用于大型数据预过滤。
对应特点
先将小表的 JOIN key 发送给大表所在 Mapper 节点
大表根据 key 预过滤,避免无关数据进入后续 JOIN 阶段
是一种优化策略,常配合 Reduce-Side Join 使用
Bloom Join(基于布隆过滤器)
适用于极端大数据量 + 高 selectivity 的场景。
对应特点
用布隆过滤器压缩小表 key 并广播
大表 Mapper 用 Bloom Filter 进行预筛选
是一种概率性过滤,可能有少量假阳性,但大大减少数据量

业务需求
平常我们在业务上,有很多时候表都是分开的,通过一些 id
或者 code
来进行关联。在大数据的情况下,也有很多这种情况,我们需要进行联表操作。
表 1
表 2
在 SQL
中,可以通过 LEFT JOIN
来实现字段补齐。大数据下,也需要进行这样的操作,我们需要借助 MapReduce
。
表 1 测试
表 2 测试
SQL 连表
假设我们使用 SQL 的方式联表:
Reduce JOIN
有时候,表可能过大,无法支持我们使用 SQL 进行连表查询。这里我们编写一个程序来完成操作。
ProjectBean
这里是最终的 Bean 类,里边是两个表把字段补齐的结果,一会儿我们将使用这个类进行表的连接。
Reduce Driver
ReduceMapper
ReduceReducer
运行结果

方案缺点
JOIN
操作是在 reduce
阶段完成的,reduce 端处理压力过大
,map
节点的运算负载很低
,资源利用
率不高
。
版权声明: 本文为 InfoQ 作者【武子康】的原创文章。
原文链接:【http://xie.infoq.cn/article/d89955ec7a379cf41aff3801b】。文章转载请联系作者。
评论