视频字幕
MapReduce是一种强大的分布式计算框架,专门用于处理大规模数据集。它采用分而治之的思想,将复杂的计算任务分解为Map和Reduce两个阶段。首先准备一个200M的待处理文件,然后通过submit方法对原始文件进行切片分析。系统会将文件按128M一块进行分割,这里0到128M为第一块,128到200M为第二块。客户端会准备三个关键组件:Job.split存储切片信息,wc.jar包含程序代码,Job.xml保存配置信息。
在YARN集群模式下,客户端会向YARN提交包含Job.split、wc.jar和Job.xml的完整作业包。YARN接收到提交后,会启动一个Mrappmaster,它是整个任务运行的管理者。Mrappmaster首先读取客户端提交的切片信息Job.split,根据切片个数来计算需要启动的MapTask数量。由于我们有两个切片,Mrappmaster会相应地启动两个MapTask来处理这些数据。这与本地模式不同,YARN集群模式必须包含jar包,这是生产环境的标准配置。
MapTask一旦启动就会立即开始工作。它首先通过InputFormat来读取输入文件,默认使用TextInputFormat格式。TextInputFormat包含两个重要方法:RecorderReader负责按行读取文件内容,isSplitable用于判断文件是否可以切割。数据读取完成后,系统会返回键值对,其中K表示整个文件中的起始字节偏移量,V表示这一行的具体内容。接下来,这些数据会被传递给用户自定义的Mapper,在Mapper中执行具体的业务逻辑代码。处理完成后,结果通过outputCollector写入到环形缓冲器中,为下一步处理做准备。
环形缓冲区是MapTask处理数据的核心组件,默认大小为100M。它采用环形设计,左侧存储索引信息,右侧存储实际数据。当环形缓冲区的数据量达到80%时,系统会触发反向写操作,将数据溢写到磁盘上。这里有个重要的设计考虑:为什么不等到100%满载才开始溢写呢?主要原因是为了不影响Mapper处理完的数据继续写入环形缓冲区。如果等到100%才溢写,就会导致Mapper处理后的数据无法写入,必须等待溢写完成,这会严重影响处理进度。因此,在80%时开始溢写,保留20%的空间供Mapper继续写入数据,确保整个处理流程的连续性和高效性。
当环形缓冲区中的数据达到80%阈值时,系统开始执行分区和排序操作。首先,数据根据Key值进行分区,每个分区将对应一个ReduceTask。在分区过程中,系统会对每个分区内的数据进行排序,确保分区内数据有序。接下来,这些已排序的数据会溢出到磁盘上,形成多个溢出文件。由于可能产生多个溢出文件,系统会使用归并排序算法对所有溢出文件进行合并,保证每个分区内的数据全局有序。最后,系统还可以选择性地执行Combiner操作,这是一个本地预聚合步骤,可以减少需要传输给ReduceTask的数据量,从而提升整体处理性能。