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事务传播机制最佳实践

《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】

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核