1.概述
MapReduce是Hadoop中一套分布式的计算框架,分为Map和Reduce两个部分,Map负责数据的整理,Reduce负责数据的汇总.
2.序列化机制
1.在MapReduce中,要求被传输的数据必须能够被序列化
2.Hadoop中,序列化机制默认使用AVRO,但是Hadoop对AVRO的序列化机制进行了进一步封装,提供了更简单的 序列化机制,只需要实现Writable,重写其中的方法即可.在序列化时,要求属性不能为null
3.分区
分区也就是对MapReduce中的数据进行分类,默认只有1个分区,可以依据业务需要指定.每个分区都必须对应一个ReduceTask,么个ReduceTask都会产生一个结果文件.MapReduce还对分区进行了编号,从0开始递增.分区的顶级父类是Partitioner
4.排序
在MapReduce中,会对键做自然排序.自定义的类可以通过WritableComparable并重写其方法来实现.
如果存在多属性排序的场景,也就是二次排序,必须要注意,如若值相同由于实现了Reduce接口所以会被当成同一个键处理,因此需要return一个数,以避免被去重.
5.合并
在MapReduce中,默认只有一个Reduce,为了提高计算效率,减轻Reduce压力,可在数据传输到Reduce之前对数据先进行一次整合,该过程就是Combine,一般情况,Combine和Reduce的逻辑是一样的,所以合并不影响最终计算结果,只需要在Driver中添加job.setCombinerClass(calss);
6.数据本地化策略
1.当JobTracker接收到应用之后,会去访问NameNode获取要处理的文件信息
2.NameNode将文件信息返回给JobTracker
3.JobTracker收到文件信息之后会将文件进行切片,一般切片大小会与切块大小设置一样.每个切片会分配给一个MapTask
4.JobTracker会MapTask分发到TaskTracker来执行.在分发的时候,哪个DataNode上有对应的Block,那么MapTask就会分发到这个节点上,也就是数据本地化
5.数据本地化的目的:减少对网络资源的消耗
7.Job的执行流程
1.客户端提交一个job任务到JobTracker
2.JobTracker收集环境信息:检测类型是否匹配;检测输入/输出路径是否合法
3.JobTracker给job分配一个全局递增的jobid,然后将jobid返回给客户端
4.客户端收到jobid之后,将jar包提交到HDFS上
5.准备执行job任务
6.JobTracker会将job任务进行划分,划分为MapTask和ReduceTask,其中MapTask的数量由切片数量决定,ReduceTask的数量由Partitioner/numReduceTask决定
7.JobTracker等待TaskTracker的心跳.一般TaskTracker和DataNode会设置为同一个节点.当TaskTracker发送心跳信息的时候,JobTracker就会给TaskTracker分配任务.注意:在分配的时候,MapTask符合数据本地化策略,也就是TaskTracker上有这个数据的时候才会将MapTask分给它,ReduceTask分配到相对空闲的节点上
8.TaskTracker领取到任务之后,到对应的节点上下载jarbap(逻辑移动而数据不动)
9.TaskTracker会在本节点内启动JVM子进程执行MapTask或者是ReduceTask . 注意: 每一个MapTask或者ReduceTask都会启动一次JVM子进程.