mapreduce计算流程: 首先将block块切片,每个切片对应一个任务. 切片的目的 是将block数量和map任务数量解耦. map读取切片数据,默认按行读取,作为键值对交给map方法,其中key是当前读取的行在文件中的字节偏移量,value就是读取的当前行. map开始计算,自定义的逻辑 map将输出的kv首先写道环形缓冲区,在写之前计算分区号(默认按照key得hash值对reduce的个数取模) 环形缓冲区默认100MB,阈值80%,如果写入得kv对达到了80%则发生溢写,溢写到磁盘,如果溢写的文件数量达到了3个,则发生map端归并操作,此时如果指定了combiner,则按照combiner压缩数据. 当一个map任务完成之后,所有得reduce向其发生http get请求,下载他们所属的分区数据,此过程称为shuffle,洗牌. 当所有map任务运行结束,开始reduce任务 在reduce任务开始之前,如果有时间则进行shuffle文件的归并并落磁盘,如果没有时间,则直接归并按组发送给reduce方法,reduce迭代计算 reduce计算结束后将结果写道HDFS. 作业提交流程 1.客户端向RM取号 2.客户端检查作业输入输出,计算切片,解析配置信息 3.客户端将jar包\配置信息以及切片信息上传到HDFS 4.客户端向RM发送提交作业的请求 5.RM调度一个NM