MapReduce模型简介
适合用MapReduce来处理的数据集需要满足一个前提条件:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。(即变量间不存在相关性)
这些小数据集可以被多个Map任务并行处理。每个Map任务输入一个小数据集,Map任务生成的结果会继续作为Reduce任务的输入,最终由Reduce任务输出最后结果,并写入分布式文件系统。
传统并行计算框架 | MapReduce | |
---|---|---|
集群框架/容错性 | 共享式(共享内存/共享存储),容错性差 | 非共享式,容错性好 |
硬件/价格/扩展性 | 刀片服务器、高速网、SAN,价格贵,扩展性差 | 普通PC机,便宜,扩展性好 |
编程/学习难度 | what-how,难 | what,简单 |
适用场景 | 实时、细粒度计算、计算密集型(航空航天,军事,国用的) | 批处理、非实时、数据密集型(民用的) |
“计算向数据靠拢”而不是“数据向计算靠拢”
只要有可能,MapReduce 框架就会将Map程序就近地在HDFS数据所在的节点运行,即将计算节点和存储节点放在一起运行,从而减少节点间的数据移动开销。
Map和Reduce函数
简单来说,大致的流程是:
数据块/文件块(任意格式,可以是文档,也可以是二进制文件) -> Map函数(分片键值对) -> Reduce函数(列表键值对) -> 最终结果写入分布式文件系统。
计算目的
Map,自定义目标的键值对,然后进行处理,意思是要用户自己去整理数据如何转为正确的键值对关系。
Reduce,得到所需的键值对之后进行的处理,可以是合并,排序等,然后输出写入具体的文件中。输出的内容仍然是键值对的形式。