mapreduce的内部核心工作机制Shuffle-maptask生成的数据传输给reducetask的过程(fifteen day)

本文主要是介绍mapreduce的内部核心工作机制Shuffle-maptask生成的数据传输给reducetask的过程(fifteen day),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

seven day second 学习了MapReduce的整体工作机制https://blog.csdn.net/ZJX103RLF/article/details/88965770

经过做了几个mapreduce练习,今儿再看看内部的核心工作机制(先学难的再回顾基础):

 

首先mapreduce是个分布式的,它的第一个工作进程叫maptask(真正的进程名字叫yarn child-->运行的逻辑叫maptask/reducetask),了解工作机制,主要是看yarn child是怎么工作的,yarn child的启动不是yarn,yarn只是提供一个容器,是由job客户端起的MRAPPMaster(在nodemanager提供的容器中起来的),MRAPPMaster再去起maptask,  maptask起来以后,会和MRAPPMaster之间保持监控,(如果监控到maptask挂了以后再起一个),接下来maptask产生数据以后,MRAPPMaster会启动若干的reducetask,这个就是整个的流程。

接下来分别了解一下map的yarn child和reduce的yarn child 起来以后是怎么工作的

map:首先对要处理的文件划分任务,划分输入切片:Job客户端负责划分:扫描输入目录中的所有文件,遍历每一个文件,按照128M规格划分范围,最后得到一个ArrayList,再把这个Arraylist序列化成一个文件,就得到了job.split文件。

maptask调TextInputFormat(FIleInputFormat的子类) 方法去读产生的切片文件,得到一个LineRecordReader,然后调里面的next()方法,每调一次LineRecordReader去读一行数据,把那行数据作为value,把那行的起始偏移量作为key,再把它交给返回值maptask,拿到key,value去调自己写的 例:WorldCountMapper,把得到的<key,value>传到方法里,然后每调一次next()都会得到context.write(key,value), 接下来会有一个MapOutputCollector类接收,把收集好的数据缓存起来(环形缓冲区,默认100M),当缓存到整个缓存区的80%时,会有一个spiller线程对缓存里面的数据分区排序(Partitioner/compaerTo),分区排序完成以后会把文件写到本地磁盘,并且MapOutputCollector会一直给缓冲区写数据,将上次排序溢出到本地的数据覆盖掉,这样就会产生好多溢出文件,而且这些文件区号小的在前面,同区中按key有序,生成这些小文件以后,会调Merge工具把这些小文件合并,合并以后也是分区且有序,同时会生成一个分区索引文件,这个文件会指明数据是从哪个偏移量到哪个偏移量,至此maptask工作已经完成。附图(借的):

maptask完事以后,会把生成的文件纳入NodeManager的web程序document目录中,reducetask去web程序中http下载自己要的那块文件(搁每一个maptask产生的文件中找自己要的,例:0reducetask找0号区数据)有几个maptask得到几个文件。得到的文件再合并排序变成一个文件,例:0号文件。得到的文件调自己写的WorldCountReduce方法(reduce[key,迭代器,context]),每调一次迭代器,就会迭代文件最开始的值,生成一个临时变量的key和value,一直迭代期间,有一个分组迭代器GroupingComparator进行分组,判断key是否一样,一样迭代,不一样就结束,下一组继续,每一组处理完之后聚合context.write(key,value)拿到数据,再传递到一个工具类TextOutputFormat里的方法(getRecordWriter()),通过该方法拿到一个LineRecordWriter对象,就是说context.write(key,value)拿到数据会反复传给write(k,v)方法,最后写成一个文件,传到HDFS上

part-r-00000 --> key \t value 附图(借的):

这篇关于mapreduce的内部核心工作机制Shuffle-maptask生成的数据传输给reducetask的过程(fifteen day)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814644

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】