MapReduce: 计算集群上的简化数据处理
摘要
MapReduce -> 程序模型 + 实现 -> 大数据
map
- 1(k, v) -> n(k, v)
reduce
- n(k, v) -> 1(k, v)
自动并行化
数据划分
程序调度
处理失败
程序通信
1. Introduction
simple, big scale
map/reduce -> Lisp
2. Programming Model
Problem: 统计文档中每个词语出现的频次
map: 1(doc, content) -> n(word, 1)
reduce: n(word, 1) -> m(word, count)
分布式grep
统计url访问频率
term-vector 统计
倒排索引 (inverted index, 转置索引)
doc -> key word : forward
key word -> doc : inverted
分布式排序
3. Implementation
物理环境
2核, 4g, x86, linux
100/1000m either
1000+ machines
individual disk using GFS
scheduling system
3.1 Executiong Overview
inputs -> map -> intermediates -> reduce -> output
将input分割成16m~64m的分片
master程序为空闲的worker分配map/reduce任务
map worker 读取input分片, 执行用户定义的map函数, 输出中间结果至memory
中间结果被周期的持久化到硬盘, 并将位置传输给master
reduce worker 从master获取缓存结果的位置, 读取中间结果, 并根据key排序
reduce worker 遍历中间结果, 执行用户定义的reduce函数, 输出最终结果到output文件
所有任务结束后, master将结果返回给用户
3.2 Master Data Structures
task state
id of worker machine for task
location of intermediate file
3.3 Fault Tolerance
Worker Failure
master 周期的 ping worker (心跳)
失败的worker, task被重置
map任务被重置, 是因为中间结果保存在本地, 已经无法获取
reduce任务不需要重置, 因为reduce结果保存在全局文件系统
map任务被重置后, reduce任务会接到通知, 重新从另外一个map worker获取结果
Master Failure
周期的写 checkpoint, 有问题则从 checkpoint 恢复
只有一台, 出错的概率低
Semantics in the Presence of Failures
如果 map/reduce 方法确定, 输出的结果也确定
通过原子提交(atomic commit)
3.4 Locality
GFS 每个分片有3个拷贝(64m)
尽量就近获取数据, 节省带宽
3.5 Task Granularity
任务粒度应该让任务数(M, R)远大于worker数, 以加速故障恢复
M和R的上限取决于 O(M + R) 的调度决策和 O(M * R) 的状态保存
M 取决于 input 大小, 因为要让分片后每片大小在16m~64m, 以提高效率(局部性)
R 取决于 worker 数量, 一般是 worker 数量的一个小倍数, 如 2000 woker 对应 R 为 5000
3.6 Backup Tasks
straggler 会导致整体任务执行变长 (木桶定律)
在复杂任务快要结束时, 为剩余的任务分配备份任务
主任务和备份任务无论哪个先执行完都可以提交
4. Refinements
使用新的分片函数, 满足用户的特殊输出需求
中间数据按照顺序排列
Zipf分布 (长尾) 导致任务分配不均, 可以使用 combiner 提前进行一轮reduce
多种形式的输入和输出(文件, 数据库, 内存)
MapReduce库会跳过错误的record
master 上跑了一个http服务器, 显示状态信息
提供 counter 功能, 负责任务数据统计