MapReduce是一种编程模型,用于大规模数据集的并行运算
在进行MapReduce计算任务的时候,任务被分为两个阶段:Map阶段和Reduce阶段。每个阶段都是用键值对(key/value)形式作为输入(input)和输出(output)
MapReduce采用的是“分而治之”的策略,一个大规模数据集会被切分成许多独立的分片,这些分片可以被多个Map任务并行处理
MapReduce框架采用Master/Slave架构,包括一个Master和多个Slave。Master上面运行JobTracker,Slave上面运行TaskTracker。
MapReduce主要由4个部分组成:
- Client
用户编写的MapReduce程序通过Client提交到JobTracker端
用户可通过Client提供的一些接口查看作业运行状态 - JobTracker
JobTracker负责资源监控和作业调度
JobTracker 监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点
JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务去使用这些资源 - TaskTracker
TaskTracker 会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作
TaskTracker 使用“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用 - HDFS
保存作业的数据、配置信息等等,最后的结果也是保存在HDFS上面
MapReduce基本架构:
MapReduce运行过程:
MapReduce的计算流程:
Input Split --> Map --> Combiner(optional) --> Shuffle --> Reduce --> Output
Combine:作用是把同一个key的键值对合并在一起,combine函数把一个map函数产生<key,value>对合并成一个新的<key,value>对,并将新的<key,value>作为输入到reduce函数中
Partition:作用就是把这些数据归类,主要在Shuffle过程中按照Key值将中间结果分成R份,其中每份都有一个Reduce去负责,可以通过job.setPartitionerClass()方法进行设置,默认的使用hashPartitioner类
Shuffle:shuffle是map和reduce中间的过程,包含两端的Combine和Partition