1 MapReduce源码分析

断了今生、忘了曾经 提交于 2020-09-28 23:05:46

MapReduce源码分析 - JobSplit

根据MapRudece的原理,我们从4个过程去分析MR的源码:

  • Split阶段;
  • MapTask阶段;
  • Shuffle阶段;
  • ReduceTask阶段;

本小节首先介绍Split阶段的源码。

 

Split源码分析

  • MR是通过JobSubmitter.submitJobInternal提交给RM的
  • 在submitJobInternal中通过writeSplits(JobContext job, Path jobSubmitDir)将job的输入文件进行split
  • writeSplit只是对新旧api进行了下封装,根据你的代码选择新旧api,这里调用writeNewSplits使用新API对file进行split
  • 整个切片的逻辑过程主要就是在writeNewSplit里

 

① writeNewSplits源码分析

进入writeNewSplits()方法,可以看出该方法首先获取splits数组信息后,排序,将会优先处理大文件,最终返回mapper数量。这其中又分为两部分:确定切片数量 和 写入切片信息。 确定切片数量的任务交由FileInputFormat的getSplits(job)完成,写入切片信息的任务交由JobSplitWriter.createSplitFiles(jobSubmitDir, conf, jobSubmitDir.getFileSystem(conf), array)方法,该方法会将切片信息和SplitMetaInfo都写入HDFS中。return array.length,返回的是map任务数,默认map的数量是: default_num = total_size / block_size;

其内部逻辑主要分为以下几个步骤:

  • 创建InputFormat实例,用实例调用getSplits方法对文件进行切分,getSplits内部是切分的主要逻辑
  • 将切片文件根据split的大小进行sort逆序排序
  • createSplitFiles:将保存切片信息的array数组落地到文件;

 

② getSplits源码分析

 

getSplits主要是将files进行切片,将文件路径path、偏移量(即起始位置,是该split在整个文件中的起始位置)、切分大小splitSize、偏移量所在block的locations信息Host和在内存中的host信息写入FileSplit对象中,一个split对应一个对象,最后放入splits中返回。

 

③ createFile源码分析

createSplitFiles创建的文件包括两个,分别是记录切片的切片文件和记录切片元数据的切片元数据文件 。

 

补充内容:

getSplits方法中split切片的大小

  • 首先要区分两个概念:块(block)和切片(split)。块是HDFS中的概念,文件在HDFS中是以块为单位进行存储。切片是MapReduce中的概念;
  • split的大小由公式可知,取决于minSize、blockSize、maxSize三者之间的大小关系;从而也决定了split和block块的大小关系,我们在实际使用中要保证split和block是一对一的关系

 

参考资料: http://bigdatadecode.club/MapReduce%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90--JobSplit.html

参考资料: https://zhuanlan.zhihu.com/p/100141817 ​​​​​​​

参考视频: https://ke.qq.com/course/1709807?taid=7923450158651119

 

 

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!