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

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定