MapReduce shuffle过程剖析及调优

MapReduce shuffle过程详解! 目录一、MR的shuffle过程二、Map shuffle三、Reduce shuffle 一、MR的shuffle过程 MR的shuffle过程: input -> map -> shuffle -> reduce ->output MR的原理图: 二、Map shuffle 1.map()的数据会写入到内存(环形缓冲区:默认大小:100mb),当数据达到缓冲区总容量的80%(阈值)时,会将我们的数据spill到本地磁盘 1)分区(partitioner):分 阅读详情

MapReduce shuffle过程剖析及调优

2016年07月18日 01:48:03 Lust-Ring 阅读数:10424 标签: mapreducehadoop 更多

个人分类: Hadoop

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/bingduanlbd/article/details/51933914

更新记录

  • 2017-07-18 初稿

MapReduce简介

在Hadoop MapReduce中,框架会确保reduce收到的输入数据是根据key排序过的。数据从Mapper输出到Reducer接收,是一个很复杂的过程,框架处理了所有问题,并提供了很多配置项及扩展点。一个MapReduce的大致数据流如下图:

这里写图片描述

更详细的MapReduce介绍参考Hadoop MapReduce原理与实例。

Mapper的输出排序、然后传送到Reducer的过程,称为shuffle。本文详细地解析shuffle过程,深入理解这个过程对于MapReduce调优至关重要,某种程度上说,shuffle过程是MapReduce的核心内容。

Mapper端

当map函数通过context.write()开始输出数据时,不是单纯地将数据写入到磁盘。为了性能,map输出的数据会写入到缓冲区,并进行预排序的一些工作,整个过程如下图:

这里写图片描述

环形Buffer数据结构

每一个map任务有一个环形Buffer,map将输出写入到这个Buffer。环形Buffer是内存中的一种首尾相连的数据结构,专门用来存储Key-Value格式的数据:

这里写图片描述

Hadoop中,环形缓冲其实就是一个字节数组:

// MapTask.java
private byte[] kvbuffer;  // main output buffer

kvbuffer = new byte[maxMemUsage - recordCapacity]; 
  • 1
  • 2
  • 3
  • 4

kvbuffer包含数据区和索引区,这两个区是相邻不重叠的区域,用一个分界点来标识。分界点不是永恒不变的,每次Spill之后都会更新一次。初始分界点为0,数据存储方向为向上增长,索引存储方向向下:

这里写图片描述

bufferindex一直往上增长,例如最初为0,写入一个int类型的key之后变为4,写入一个int类型的value之后变成8。

索引是对key-value在kvbuffer中的索引,是个四元组,占用四个Int长度,包括:

  • value的起始位置
  • key的起始位置
  • partition值
  • value的长度
private static final int VALSTART = 0;    // val offset in acct
private static final int KEYSTART = 1;    // key offset in acct
private static final int PARTITION = 2;   // partition offset in acct
private static final int VALLEN = 3;      // length of value
private static final int NMETA = 4;       // num meta ints
private static final int METASIZE = NMETA * 4; // size in bytes
 // write accounting info
kvmeta.put(kvindex + PARTITION, partition);
kvmeta.put(kvindex + KEYSTART, keystart);
kvmeta.put(kvindex + VALSTART, valstart);
kvmeta.put(kvindex + VALLEN, distanceTo(valstart, valend));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

kvmeta的存放指针kvindex每次都是向下跳四个“格子”,然后再向上一个格子一个格子地填充四元组的数据。比如kvindex初始位置是-4,当第一个key-value写完之后,(kvindex+0)的位置存放value的起始位置、(kvindex+1)的位置存放key的起始位置、(kvindex+2)的位置存放partition的值、(kvindex+3)的位置存放value的长度,然后kvindex跳到-8位置。

缓冲区的大小默认为100M,但是可以通过mapreduce.task.io.sort.mb这个属性来配置。

Spill

map将输出不断写入到这个缓冲区中,当缓冲区使用量达到一定比例之后,一个后台线程开始把缓冲区的数据写入磁盘,这个写入的过程叫spill。开始spill的Buffer比例默认为0.80,可以通过mapreduce.map.sort.spill.percent配置。在后台线程写入的同时,map继续将输出写入这个环形缓冲,如果缓冲池写满了,map会阻塞直到spill过程完成,而不会覆盖缓冲池中的已有的数据。

在写入之前,后台线程把数据按照他们将送往的reducer进行划分,通过调用Partitioner的getPartition()方法就能知道该输出要送往哪个Reducer。默认的Partitioner使用Hash算法来分区,即通过key.hashCode() mode R来计算,R为Reducer的个数。getPartition返回Partition事实上是个整数,例如有10个Reducer,则返回0-9的整数,每个Reducer会对应到一个Partition。map输出的键值对,与partition一起存在缓冲中(即前面提到的kvmeta中)。假设作业有2个reduce任务,则数据在内存中被划分为reduce1和reduce2:

这里写图片描述

并且针对每部分数据,使用快速排序算法(QuickSort)对key排序。

如果设置了Combiner,则在排序的结果上运行combine。

排序后的数据被写入到mapreduce.cluster.local.dir配置的目录中的其中一个,使用round robin fashion的方式轮流。注意写入的是本地文件目录,而不是HDFS。Spill文件名像sipll0.out,spill1.out等。

不同Partition的数据都放在同一个文件,通过索引来区分partition的边界和起始位置。索引是一个三元组结构,包括起始位置、数据长度、压缩后的数据长度,对应IndexRecord类:

public class IndexRecord {
  public long startOffset;
  public long rawLength;
  public long partLength;

  public IndexRecord() { }

  public IndexRecord(long startOffset, long rawLength, long partLength) {
    this.startOffset = startOffset;
    this.rawLength = rawLength;
    this.partLength = partLength;
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

每个mapper也有对应的一个索引环形Buffer,默认为1KB,可以通过mapreduce.task.index.cache.limit.bytes来配置,索引如果足够小则存在内存中,如果内存放不下,需要写入磁盘。 
Spill文件索引名称类似这样 spill110.out.index, spill111.out.index。

Spill文件的索引事实上是 org.apache.hadoop.mapred.SpillRecord的一个数组,每个Map任务(源码中的MapTask.java类)维护一个这样的列表:

final ArrayList<SpillRecord> indexCacheList = new ArrayList<SpillRecord>();
  • 1

创建一个SpillRecord时,会分配(Number_Of_Reducers * 24)Bytes缓冲:

public SpillRecord(int numPartitions) {
  buf = ByteBuffer.allocate(
      numPartitions * MapTask.MAP_OUTPUT_INDEX_RECORD_LENGTH);
  entries = buf.asLongBuffer();
}
  • 1
  • 2
  • 3
  • 4
  • 5

numPartitions是Partition的个数,其实也就是Reducer的个数:

public static final int MAP_OUTPUT_INDEX_RECORD_LENGTH = 24;

// ---

partitions = jobContext.getNumReduceTasks();
final SpillRecord spillRec = new SpillRecord(partitions);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

默认的索引缓冲为1KB,即1024*1024 Bytes,假设有2个Reducer,则每个Spill文件的索引大小为2*24=48 Bytes,当Spill文件超过21845.3时,索引文件就需要写入磁盘。

索引及spill文件如下图示意:

这里写图片描述

Spill的过程至少需要运行一次,因为Mapper的输出结果必须要写入磁盘,供Reducer进一步处理。

合并Spill文件

在整个map任务中,一旦缓冲达到设定的阈值,就会触发spill操作,写入spill文件到磁盘,因此最后可能有多个spill文件。在map任务结束之前,这些文件会根据情况合并到一个大的分区的、排序的文件中,排序是在内存排序的基础上进行全局排序。下图是合并过程的简单示意:

这里写图片描述

相对应的索引文件也会被合并,以便在Reducer请求对应Partition的数据的时候能够快速读取。

另外,如果spill文件数量大于mapreduce.map.combiner.minspills配置的数,则在合并文件写入之前,会再次运行combiner。如果spill文件数量太少,运行combiner的收益可能小于调用的代价。

mapreduce.task.io.sort.factor属性配置每次最多合并多少个文件,默认为10,即一次最多合并10个spill文件。最后,多轮合并之后,所有的输出文件被合并为唯一一个大文件,以及相应的索引文件(可能只在内存中存在)。

压缩

在数据量大的时候,对map输出进行压缩通常是个好主意。要启用压缩,将mapreduce.map.output.compress设为true,并使用mapreduce.map.output.compress.codec设置使用的压缩算法。

通过HTTP暴露输出结果

map输出数据完成之后,通过运行一个HTTP Server暴露出来,供reduce端获取。用来相应reduce数据请求的线程数量可以配置,默认情况下为机器内核数量的两倍,如需自己配置,通过mapreduce.shuffle.max.threads属性来配置,注意该配置是针对NodeManager配置的,而不是每个作业配置。

同时,Map任务完成后,也会通知Application Master,以便Reducer能够及时来拉取数据。

通过缓冲、划分(partition)、排序、combiner、合并、压缩等过程之后,map端的工作就算完毕:

这里写图片描述

Reducer端

各个map任务运行完之后,输出写入运行任务的机器磁盘中。Reducer需要从各map任务中提取自己的那一部分数据(对应的partition)。每个map任务的完成时间可能是不一样的,reduce任务在map任务结束之后会尽快取走输出结果,这个阶段叫copy。 
Reducer是如何知道要去哪些机器去数据呢?一旦map任务完成之后,就会通过常规心跳通知应用程序的Application Master。reduce的一个线程会周期性地向master询问,直到提取完所有数据(如何知道提取完?)。

数据被reduce提走之后,map机器不会立刻删除数据,这是为了预防reduce任务失败需要重做。因此map输出数据是在整个作业完成之后才被删除掉的。

reduce维护几个copier线程,并行地从map任务机器提取数据。默认情况下有5个copy线程,可以通过mapreduce.reduce.shuffle.parallelcopies配置。

如果map输出的数据足够小,则会被拷贝到reduce任务的JVM内存中。mapreduce.reduce.shuffle.input.buffer.percent配置JVM堆内存的多少比例可以用于存放map任务的输出结果。如果数据太大容不下,则被拷贝到reduce的机器磁盘上。

内存中合并

当缓冲中数据达到配置的阈值时,这些数据在内存中被合并、写入机器磁盘。阈值有2种配置方式:

  • 配置内存比例: 前面提到reduce JVM堆内存的一部分用于存放来自map任务的输入,在这基础之上配置一个开始合并数据的比例。假设用于存放map输出的内存为500M,mapreduce.reduce.shuffle.merger.percent配置为0.80,则当内存中的数据达到400M的时候,会触发合并写入。
  • 配置map输出数量: 通过mapreduce.reduce.merge.inmem.threshold配置。

在合并的过程中,会对被合并的文件做全局的排序。如果作业配置了Combiner,则会运行combine函数,减少写入磁盘的数据量。

Copy过程中磁盘合并

在copy过来的数据不断写入磁盘的过程中,一个后台线程会把这些文件合并为更大的、有序的文件。如果map的输出结果进行了压缩,则在合并过程中,需要在内存中解压后才能给进行合并。这里的合并只是为了减少最终合并的工作量,也就是在map输出还在拷贝时,就开始进行一部分合并工作。合并的过程一样会进行全局排序。

最终磁盘中合并

当所有map输出都拷贝完毕之后,所有数据被最后合并成一个排序的文件,作为reduce任务的输入。这个合并过程是一轮一轮进行的,最后一轮的合并结果直接推送给reduce作为输入,节省了磁盘操作的一个来回。最后(所以map输出都拷贝到reduce之后)进行合并的map输出可能来自合并后写入磁盘的文件,也可能来及内存缓冲,在最后写入内存的map输出可能没有达到阈值触发合并,所以还留在内存中。

每一轮合并并不一定合并平均数量的文件数,指导原则是使用整个合并过程中写入磁盘的数据量最小,为了达到这个目的,则需要最终的一轮合并中合并尽可能多的数据,因为最后一轮的数据直接作为reduce的输入,无需写入磁盘再读出。因此我们让最终的一轮合并的文件数达到最大,即合并因子的值,通过mapreduce.task.io.sort.factor来配置。

假设现在有50个map输出文件,合并因子配置为10,则需要5轮的合并。最终的一轮确保合并10个文件,其中包括4个来自前4轮的合并结果,因此原始的50个中,再留出6个给最终一轮。所以最后的5轮合并可能情况如下:

这里写图片描述

前4轮合并后的数据都是写入到磁盘中的,注意到最后的2格颜色不一样,是为了标明这些数据可能直接来自于内存。

MemToMem合并

除了内存中合并和磁盘中合并外,Hadoop还定义了一种MemToMem合并,这种合并将内存中的map输出合并,然后再写入内存。这种合并默认关闭,可以通过reduce.merge.memtomem.enabled打开,当map输出文件达到reduce.merge.memtomem.threshold时,触发这种合并。

最后一次合并后传递给reduce方法

合并后的文件作为输入传递给Reducer,Reducer针对每个key及其排序的数据调用reduce函数。产生的reduce输出一般写入到HDFS,reduce输出的文件第一个副本写入到当前运行reduce的机器,其他副本选址原则按照常规的HDFS数据写入原则来进行,详细信息请参考这里。

通过从map机器提取结果,合并,combine之后,传递给reduce完成最后工作,整个过程也就差不多完成。最后再感受一下下面这张图:

这里写图片描述

性能调优

如果能够根据情况对shuffle过程进行调优,对于提供MapReduce性能很有帮助。相关的参数配置列在后面的表格中。

一个通用的原则是给shuffle过程分配尽可能大的内存,当然你需要确保map和reduce有足够的内存来运行业务逻辑。因此在实现Mapper和Reducer时,应该尽量减少内存的使用,例如避免在Map中不断地叠加。

运行map和reduce任务的JVM,内存通过mapred.child.java.opts属性来设置,尽可能设大内存。容器的内存大小通过mapreduce.map.memory.mb和mapreduce.reduce.memory.mb来设置,默认都是1024M。

map优化

在map端,避免写入多个spill文件可能达到最好的性能,一个spill文件是最好的。通过估计map的输出大小,设置合理的mapreduce.task.io.sort.*属性,使得spill文件数量最小。例如尽可能调大mapreduce.task.io.sort.mb。

map端相关的属性如下表:

属性名值类型默认值说明
mapreduce.task.io.sort.mbint100用于map输出排序的内存大小
mapreduce.map.sort.spill.percentfloat0.80开始spill的缓冲池阈值
mapreduce.task.io.sort.factorint10合并文件数最大值,与reduce共用
mapreduce.map.combine.minspillsint3运行combiner的最低spill文件数
mapreduce.map.out.compressbooleanfalse输出是否压缩
mapreduce.map.out.compress类名DefaultCodec压缩算法
mapreduce.shuffle.max.threadsint0服务于reduce提取结果的线程数量

reduce优化

在reduce端,如果能够让所有数据都保存在内存中,可以达到最佳的性能。通常情况下,内存都保留给reduce函数,但是如果reduce函数对内存需求不是很高,将mapreduce.reduce.merge.inmem.threshold(触发合并的map输出文件数)设为0,mapreduce.reduce.input.buffer.percent(用于保存map输出文件的堆内存比例)设为1.0,可以达到很好的性能提升。在2008年的TB级别数据排序性能测试中,Hadoop就是通过将reduce的中间数据都保存在内存中胜利的。

reduce端相关属性:

属性名值类型默认值说明
mapreduce.reduce.shuffle.parallelcopiesint5提取map输出的copier线程数
mapreduce.reduce.shuffle.maxfetchfailuresint10提取map输出最大尝试次数,超出后报错
mapreduce.task.io.sort.factorint10合并文件数最大值,与map共用
mapreduce.reduce.shuffle.input.buffer.percentfloat0.70copy阶段用于保存map输出的堆内存比例
mapreduce.reduce.shuffle.merge.percentfloat0.66开始spill的缓冲池比例阈值
mapreduce.reduce.shuffle.inmem.thresholdint1000开始spill的map输出文件数阈值,小于等于0表示没有阈值,此时只由缓冲池比例来控制
mapreduce.reduce.input.buffer.percentfloat0.0reduce函数开始运行时,内存中的map输出所占的堆内存比例不得高于这个值,默认情况内存都用于reduce函数,也就是map输出都写入到磁盘

通用优化

Hadoop默认使用4KB作为缓冲,这个算是很小的,可以通过io.file.buffer.size来调高缓冲池大小。

参考

GK2302量产工具下载方法,GK2302开卡教程,GK2301LT怎么开卡方法,附GK2302开卡工具,GK2301LT量产软件下载 ​每种量产软件的操作流程可能略有不同,因此必须按照要求操作。为确保安全,建议使用量产部落网下载的原版量产开卡软件。 阅读详情

相关推荐

Go语言集成Ollama本地大模型:gollama库实战指南

在当今的AI应用开发中,大型语言模型(LLM)的集成已成为关键技术。其核心原理是通过API调用,将自然语言处理能力嵌入到各类应用中。从技术价值看,本地化部署的LLM解决了数据隐私、网络延迟和持续成本三大痛点,尤其适合处理敏感数据或对实时性要求高的场景。在工程实践中,开发者常使用专门的客户端库来简化与模型服务的交互,例如通过封装REST API、提供类型安全接口和流式处理支持,从而提升开发效率和代码健壮性。具体到Go语言生态,结合Ollama这一流行的本地大模型运行工具,可以实现完全离线、低延迟的AI功能集成

weixin_28728443的博客 605

MapReduce shuffle过程详解

一、MapReduce计算模型 MapReduce计算模型主要由三个阶段构成:Map、Shuffle、Reduce。 Map是映射,负责数据的过滤分法,将原始数据转化为键值对;Reduce是合并,将具有相同key值的value进行处理后再输出新的键值对作为最终结果。为了让Reduce可以并行处理Map的结果,必须对Map的输出进行一定的排序与分割,然后再交给对应的Reduce,而这个将Map输出进...

thinkhui的专栏 1万+

利用ADS设计射频功率放大器

利用ADS设计射频功率放大器 任务: 用飞思卡尔公司的功率放大器芯片ATF27s006NT1设计射频功放,芯片频率范围可达450MHz-3.6GHz。 功放指标: (1) 工作频率:500MHz (2) 增益:G>20dB (3) 电源:+28V (4) 最大输出功率:2W(33dBm) 设计思路 (1)安装DesignKit模型; (2)直流DC扫描; (3)稳定性分析; (4)偏置电路设计及整...

UVM频率 3万+

MapReduce调优总结

一、调优的目的 充分的利用机器的性能,更快的完成mr程序的计算任务。甚至是在有限的机器条件下,能够支持运行足够多的mr程序。 二、调优的总体概述 从mr程序的内部运行机制,我们可以了解到一个mr程序由mapper和reducer两个阶段组成, 其中mapper阶段包括: (1)数据的读取、 (2)map处理以及写出操作(排序和合并/sort&merge), 而reducer阶段包含: (1...

婲落ヽ红颜谇的博客 503

【AI 智能体】Windows 环境 Hermes Agent(爱马仕)安装详细过程

Windows 环境 Hermes Agent(爱马仕)安装详细过程

congge_study的博客 1829

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1658

从MapReduce的Shuffle原理 进行 生产参数调优

文章目录1.mapreduce的过程上图2.map 切分输入文件3.环形缓冲区3.1 原理3.2 生产调优3.2.1 mapreduce.task.io.sort.mb(default:100m)3.2.2 mapreduce.map.sort.spill.percent(default:0.80)4.数据在spill到磁盘之前会做partition,sort操作4.1 原理4.2 生产调优5. 溢写到磁盘(spill to disk)5.1 原理5.2 生产调优参数5.2.1 mapreduce.task

lihuazaizheli的博客 1836

【大模型】SpringBoot整合LangChain4j实现RAG检索实战详解

SpringBoot整合LangChain4j实现RAG检索实战详解

congge 1万+

MapReduce shuffle过程剖析及调优【一篇就够】

收藏温习用,更多好文请关注原文博主!!!原文=&gt;https://blog.csdn.net/bingduanlbd/article/details/51933914MapReduce简介在Hadoop MapReduce中,框架会确保reduce收到的输入数据是根据key排序过的。数据从Mapper输出到Reducer接收,是一个很复杂的过程,框架处理了所有问题,并提供了很多配置项及扩展点。...

sjmz30071360的专栏 1204

如何成为一名高级数字 IC 设计工程师(6-7)数字 IC 验证篇:DEBUG 技巧

不懂验证的设计不是好的设计;UVM 验证思维是指导缜密的芯片设计的导师;推荐书籍《芯片验证漫游指南》。

新芯设计的博客 1605

基于YOLOv8和时序模型的异常动作检测系统

异常动作检测是计算机视觉领域的重要应用,广泛应用于智能监控、安防系统、老人看护等场景。本项目结合YOLOv8目标检测和LSTM时序模型,实现对打架、摔倒、奔跑等异常动作的实时检测,并提供了完整的Web界面。多技术融合: 结合YOLOv8目标检测和LSTM时序建模实时检测: 支持实时视频流处理和文件分析用户友好: 提供完整的Web界面可扩展性: 模块化设计便于功能扩展高性能: 包含多种优化策略。

YOLO 764

MapReduce中shuffle和排序(转)

我觉得这篇博客写的很好,hadoop权威指南没有讲清楚的、没 看懂的这个上面都讲的很详细,收藏一下!点击打开原文 MapReduce简介 在Hadoop MapReduce中,框架会确保reduce收到的输入数据是根据key排序过的。数据从Mapper输出到Reducer接收,是一个很复杂的过程,框架处理了所有问题,并提供了很多配置项及扩展点。一个MapReduce的大致数据流如下图:...

柯南爱上指针的博客 2482

第201期 解锁科研效率新高度:Claude 科学技能插件(claude-scientific-skills)深度体验

科研AI助手Claude Scientific Skills开源工具为Claude大模型扩展科学能力,覆盖数据可视化、数学计算、学术格式处理等科研全流程需求。该插件支持LaTeX公式生成、自动化科研图表绘制、学术文档规范校正等功能,让研究人员通过自然语言指令即可完成专业任务。项目开源可定制,支持特定学科需求扩展,目前已托管于GitHub。使用门槛低,只需配置Claude API密钥即可快速启用,帮助科研人员从繁琐技术细节中解放,聚焦核心研究创新。

全网120W+关注AI拉呱,专注人工智能以及科技前沿! 1358

MapReduce Shuffle 参数调优【转载】

Map阶段 -- 环形缓冲区大小,默认100m set mapreduce.task.io.sort.mb = 200; -- 环形缓冲区溢写阈值,默认0.8 --> set mapreduce.map.sort.spill.percent = 0.9; -- merge合并次数,默认10个 --> set mapreduce.task.io.sort.factor = 20; -- maptask内存,默认1g; maptask堆内存大小默认和该值大小一致mapreduce.m

zhsworld的博客 665

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Hadoop-MapReduce学习

Hadoop-MapReduce学习 摘要 本文简要将就爱你过MapReduce,重点是Shuffle部分 0x01 MapReduce-Mapper侧 1.1 简介 以上是一张Hadoop官方创作的MR过程图示。我们以大数据届的HelloWorld-WordCount为例讲述下MR过程。 1.2 Split-分片 1.2.1 Split简述 Map阶段的输入通常是HDFS上文件。 在运行Ma...

迷路剑客个人博客 1580

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MapReduce:详解Shuffle过程

Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方。要想理解MapReduce, Shuffle是必须要了解的。我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混。前段时间在做MapReduce job 性能调优的工作,需要深入代码研究MapReduce的运行机制,这才对Shuffle探了个究竟。考虑到之前我在看相关资料而看不懂时很恼火,所以在这里

lingzihan1215的专栏 444

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Hadoop权威指南---MapReduce的工作机制

目录 1、 剖析MapReduce作业运行机制  ​1.1、 作业的提交  ​1.2、 作业的初始化  ​1.3、 任务的分配  ​1.4 、任务的执行  1.5、 进度和状态的更新 ​1.6、 作业的完成  ​2 、失败  2.1、 任务运行失败 ​2.2、 application master运行失败 ​2.3 、节点管理器运行失败  ​2.4 、资源管理器运行失败  ...

l1394049664的博客 871

MapReduce理论

工作流程

weixin_51699336的博客 555

架构师带你细细的捋一遍MapReduce全流程【附调优指南】

这是我的第22篇原创MapReduce是分布式计算的鼻祖,虽然我们已经不需要再写MR了,但是了解MR的底层逻辑,对解决各种分布式遇到的问题、调优,有极大的帮助。废话不多说,OK,let&#...

weixin_52346300的博客 294
上一篇: Mongodb自动删除过期的数据——TTL索引
下一篇: 100万并发连接服务器笔记之Java Netty处理1M连接会怎么样
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值