这篇文章将为大家详细讲解有关如何进行MapReduce中的JobSplit源码分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
根据MapRudece的原理,我们从4个过程去分析MR的源码:
Split阶段;
MapTask阶段;
Shuffle阶段;
ReduceTask阶段;
下面首先介绍Split阶段的源码。
MR是通过JobSubmitter.submitJobInternal提交给RM的
在submitJobInternal中通过writeSplits(JobContext job, Path jobSubmitDir)
将job的输入文件进行split
writeSplit只是对新旧api进行了下封装,根据你的代码选择新旧api,这里调用writeNewSplits
使用新API对file进行split
整个切片的逻辑过程主要就是在writeNewSplit里
进入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主要是将files进行切片,将文件路径path、偏移量(即起始位置,是该split在整个文件中的起始位置)、切分大小splitSize、偏移量所在block的locations信息Host和在内存中的host信息写入FileSplit
对象中,一个split对应一个对象,最后放入splits中返回。
createSplitFiles创建的文件包括两个,分别是记录切片的切片文件和记录切片元数据的切片元数据文件 。
补充内容:
getSplits方法中split切片的大小
首先要区分两个概念:块(block)和切片(split)。块是HDFS中的概念,文件在HDFS中是以块为单位进行存储。切片是MapReduce中的概念;
split的大小由公式可知,取决于minSize、blockSize、maxSize三者之间的大小关系;从而也决定了split和block块的大小关系,我们在实际使用中要保证split和block是一对一的关系;
关于如何进行MapReduce中的JobSplit源码分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。