1. Research Objective
实现一个基于普通主机集群的高可扩展性的分布式编程框架,使用者不需要去考虑计算的并行,系统的容错,数据的分发,负载平衡等问题,专注于业务本身。
2. Programming model
计算任务的输入是一个键值对的集,输出是另一个键值对的集,用户将将计算任务抽象成map和reduce两个阶段。
map阶段,map函数接受一个键值对的输入,输出键值对的集合作为中间结果,mapreduce库负责将所有具有相同键的值进行聚合,reduce阶段的输入
reduce阶段,reduce函数接受一个中间结果的键和这个键对应的聚合的值的列表,reduce函数将这些值聚合构建一个可能更小的集合。其中,中间结果的值会以一个迭代器的形式传入到reduce当中以适应值过多超过内存限制的情况。
map(K1, V1) -> list(K2, V2)
reduce(K2, list(V2)) -> list(V2)
具体应用例子:
- 分布式的 Grep map方法输入一行,如果该行能够匹配,输出该行; reduce方法是一个01函数,只将输入的值进行输出
- 计算URL的访问次数 map方法处理给定的日志,输出<URL, 1>的列表,reduce方法将所有相同URL的键值对进行累加,返回<URL, TOTAL COUNT>
- 倒排索引 map方法解析一个网页文档,输出一个(word, document ID)的序列;reduce方法接受所有具有给定word的键值对,对documentID进行排序后输出(word, list(doucument ID)),所有的输出集合构成一个简单的倒排索引
不同环境对应不同版本的合适的mapreduce实现,文章介绍适用于google的环境的实现:
- 大量的普通PC机器
- 商业网络设备
- 运行在具有数百台client的集群之上,机器故障是大概率事件
- 使用便宜的IDE硬盘作为存储,机器可以直接访问这些硬盘,文件系统通过备份实现在不可靠硬件上的可靠性和可用性
- 用户向调度系统提交工作,每个工作由若干个人物足证,调度系统负责将这些任务分发到一个集群中的一些可用的机器上