MapReduce核心知识点
一、基本概念
- 编程模型:分布式计算框架,用于处理海量数据
- 核心思想:
- 分而治之:将任务分解为$Map$和$Reduce$两个阶段
- 数据本地化:计算节点靠近数据存储位置
二、核心组件
$$Map(k1, v1) → list(k2, v2)$$ $$Reduce(k2, list(v2)) → list(v3)$$
组件 | 功能描述 |
---|---|
InputFormat | 数据分片与解析 |
Mapper | 处理原始数据生成中间键值对 |
Partitioner | 确定中间结果分配到哪个Reducer |
Combiner | 本地Reduce操作(可选优化) |
三、工作流程
-
输入分片:将输入数据划分为$block_size=128MB$的块
-
Map阶段:
# 伪代码示例 def map(key, value): for word in value.split(): emit(word, 1)
-
Shuffle阶段:网络传输中间结果,执行归并排序
-
Reduce阶段:
def reduce(key, values): total = sum(values) emit(key, total)
四、关键特性
- 横向扩展:通过增加节点提升计算能力
- 容错机制:
- 心跳检测(Heartbeat)
- 任务重试(Task Retry)
- 数据流优化:
- 数据压缩:减少网络传输量
- 推测执行(Speculative Execution)
五、典型应用场景
- 词频统计(Word Count)
- 网页索引构建
- 日志分析
- 机器学习特征处理
六、性能优化公式
$$总时间 = max(map_time) + shuffle_time + max(reduce_time)$$
七、优缺点分析
优势:
- 自动并行化处理
- 隐藏分布式系统细节
局限:
- 不适合迭代计算
- 中间结果写磁盘影响性能
八、代码实现示例(伪代码)
# Map函数
def mapper(line):
for word in line.split():
yield (word, 1)
# Reduce函数
def reducer(word, counts):
yield (word, sum(counts))
九、扩展知识
- 任务调度:采用Master-Worker架构
- 计数器:统计全局事件
- 数据倾斜处理:
- 使用Combiner预聚合
- 自定义分区策略
注:实际工程实现建议参考Hadoop、Spark等框架的具体实现细节。