什么是MapReduce
- 定义:MapReduce是一种编程模型,用于高效地进行大规模数据集的离线并行计算,Map指的是计算工作,Reduce指的是聚合工作。
- 准则(Hadoop):
- 所有计算分解为map或者reduce任务实现
- 每个任务处理全部输入数据中的一部分
- 主要根据输入数据和输出数据定义任务
- 任务依赖于自己的输入数据,不需要与其它任务通信
- 基本步骤:以统计各个用户总在线时间为例,原始日志文件如下,除了userId和TimeSpent,其它都是无用列
1. 拆解:日志是以行为单位的,各行之间是独立的。这意味着输入文件可以按照任意行数并行处理、独立处理,然后聚合生成相同的结果。现在我们将其切分为4份,分给四台机器。
2. Map计算:将map函数写好后交给各个机器,机器会用此函数处理输入,产出结果,结果一般都是键值对集合。
public class Map extends Mapper<LongWritable, Text, Text, LongWritable> {
protected void map(LongWritable key, Text value,Context context) {
//...拆解value进行统计,结果写入context
}
}
3. 洗牌与排序(Hadoop自动执行):各个机器产出结果后,每个reducer被安排一组UserID值,然后从mapper节点复制对应的键值对[k2,v2](洗牌)。然后将结果以UserID为单位进行聚合(排序)。这一过程为Reduce阶段的聚合做准备,过程中不会改变值,只是重新组合数据
4. 正式Reduce聚合:处理[k2,<v2>],进行加总,最终将结果写回到Hadoop
为什么要有MapReduce
- 与在线系统的注重点不同:与在线系统注重响应时间不同,离线计算更需要高吞吐量,所以需要一种专门的工具用于离线计算。
- 串行计算吞吐量有限:单线程处理大量数据,时间过长。
- 单机并行计算依旧有限:虽然能充分利用多核,但对于大量的数据,依旧需要很长时间处理。并行化可能受到编程语言设计、存储引擎实现方式、函数库API的限制,效果没有那么理想。
- 多台机器并行计算:如果只是简单的将切分到多台机器上,聚合环节也需要类似的并行方案。如果运行期间有个线程卡住,有硬盘故障或者出现网络故障,都需要去解决。所以需要很多额外的协调维护工作。分布式计算框架Hdoop应运而生。