一、MapReduce是用于解决什么问题的?
每一种技术的出现都是用来解决实际问题的,否则必将是昙花一现,那么MapReduce是用来解决什么实际的业务呢?
首先来看一下MapReduce官方定义:
总结一句话:MapReduce就是批量处理海量数据的分布式计算框架。
在数据规模比较小时,如果要批量处理一些数据,通常都是在凌晨跑一个或者多个定时任务,定时任务直接连接业务库,从业务库中读取然后批量处理,但是当业务规模逐渐大了之后,像凌晨跑定时任务的方式已不足以支撑业务开展,这时分布式计算诞生了,分布式计算将一个很大的任务切分成很小的子任务,然后将子任务分发到集群上的节点上去执行,执行完之后在合并结果并对外提供服务,MapReduce就是用来解决这种业务场景的。
二、MapReduce架构
< 未完>
三、MapReduce执行流程
执行流程说明:
1. 如果在HDFS上存在一份数据,这份数据被分成4个Block存储(这里假设一个Block就是一个Record), 当MapReduce处理这份数据时,会启动4个Map Task去批量处理,输出的结果是键值对形式
2. Map Task将输出结果写入内存缓冲区(memory buffer),并根据设定Reduce个数据对内存缓冲区里的数据做partition,这时候内存缓冲区的数据有键值对形式变成三元组的形式,如上图(Partition结果),三元组第一个元素为分区号,表示该行数据会分到哪个区。
3. 做完partition之后接着就是sort, 这里排序有2次
3.1 第一次排序:对分区号做排序
3.2 第二次排序:对每个分区里的数据做排序
2次排序之后得到的结果如上图中红框所示
4. 如果Map Task输出的数据量很大,超过100M。当达到80M时spill线程会将结果溢写到磁盘,在磁盘上可能会产生很多个spill文件,
5. 当所有的Map Task执行完之后,MapReduce框架将多个spill文件merge成一个大的文件,这个大文件也是分区好了的
6. 这时TaskTracker通过心跳上报JobTracker, 告诉JobTracker Map Task任务已经跑完了,JobTracker将分配Reduce资源,然后TaskTracker将第5步骤里的大文件按分区号远程拷贝到Reduce机器上
7. Reduce Task对Map Task输出的结果处理,然后生成处理结果写入到HDFS上。注意:一个Reduce Task产生一个文件。