MapReduce处理大数据集的过程是把大数据集分解成为成百上千个小数据集,每个数据集分别由整个HDFS集群中一个节点进行处理并生成中间结果,然后将这些中间结果又由大量的节点合并,形成最终结果。其原理是
1、数据的分布式存储
HDFS和普通的文件系统一据,每一份Block还会复制成数份数据存储到不同的DataNode上,而NameNode成为整个HDFS的核心,它通过维护一些数据结构来记录每一个文件被切割成多少个Block,这些Block可以从那些DataNode中获取,以及各个Datanode的状态。
2、分布式的并行计算
MapReduce结构中关于任务执行有两个样,利用它可以创建目录,创建、复制、删除文件,并且可以查看文件内容,但是在HDFS的底层,被切割成了Block,这些Block被分散的不同的DataNode上面,其外为了备份数相关的节点分别是主节点JobTracker和集群从节点TaskTracker。其中JobTracker是主控负责把Map任务或是Reduce任务指定给哪个TaskTracker运行,可以运行在任何的计算机上,TaskTracker负责具体执行任务,必须运行在Datanode上面,如果某个TaskTracker出现问题,JobTracker会把其上面运行的Map任务或者是Reduce任务指定给其他的空闲的TaskTracker运行。
3、本地计算
数据存储到那一台计算机上面就有那一台计算机负责这部分数据的计算,减少数据在网络上面传输(数据在网络上传输需要带宽),移动计算比移动数据更经济。
4、任务粒度
把原始大数据集体切割小数据集时,通常使得小数据集小于或者等于HDFS中的一个Block的大小(默认是64MB),这样保证一个小数据在一台计算机上,如果有M个小数据集待处理,就启动M个Map任务(分部在N台服务器上面,他们讲并行运行)。
5、数据分割
M个Map任务产生了M个中间结果,把这些中间结果分成R份(R是事先由Reduce任务的个数),这样每一份中间结果都有一个Reduce函数来处理。
6、数据合并
在对中间结果进行Reduce函数运算前,可以对中间结果中具有相同的key的进行合并,这样可以减少在网络上面传输的数据
7、Reduce
Map任务的中间结果在执行完Combine和Partition之后,以文本形式存储于本地磁盘上。中间结果文件的位置会通知主控的JobTracker。JobTracker再通知Reduce任务到哪一个TaskTracker上取中间结果。
8、任务管道
有R个Reduce任务,就会有R个最终结果。很多情况下这R个最终结果并不需要合并成一个最终结果,因为R个最终结果可能作为另一个计算任务的输入,开始另一个并行计算任务,这也就形成了任务管道。