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

相关文章

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面