Shuffle原理

·  MapReduce是怎样为数据进行分组,整合等操作的呢?这就涉及到Map和Reduce在中间十分关键的衔接部分Shuffle。
上面介绍了Map 和 Reduce的各自的任务和总的流程,MapReduce是怎样为数据进行分组,整合等操作的呢?这就涉及到Map和Reduce在中间十分关键的衔接部分Shuffle。
  什么是shuffle?shuffle原意是洗牌,混乱。而在MapReduce中shuffle却是将一些凌乱的数据规整成有一定规则的过程。Shuffle是横跨MapReduce的两端。

在这里插入图片描述

下面详细介绍一下shuffle的运行过程:
  
  在Mapper中的shuffle
  
  1.当MapTask获取到Split之后按行读取数据
  
  2.每读取一行调用一次map方法
  
  3.每一行经过map方法处理以后,会产生一个或者多个key-value结果
  
  4.Key-value的数据会暂时存到一个环形的缓冲区,这个缓冲区维系在内存中。
  
  5.在缓冲区中会对数据进行分区-partition, 排序-sort, 合并-combine操作
  
  6.当缓冲区使用在达到阈值(已使用缓冲区/缓冲区的总量,默认是0.8),将缓冲区的数据写到当前的磁盘中(spill—溢写),保存数据的格式—溢写。
  
  7.对于单个溢写文件而言,里面的数据是分好区排好序的,但是对于整体所有的溢写文件而言是无序的。
  
  8.等到所有的数据写完,会将所有的溢写文件进行一次合并(merge),合并到一个新的分区并且排序的文件中
  
  9.再最终合并的时候,溢写文件个数<=3,那么合并完成之后会再执行一次Combinaer

在这个过程中需要注意的问题:
  1. 当产生溢写的时候,缓冲区最后残留的数据会flush到最后一个溢写文件中
  2.Spill理论上默认是80M,但是要考虑序列化以及最后的冲刷等因素
  3.不能凭借一个MapTask处理的切片大小来衡量MapTask之后的输出数据的多少
  4.每一个切片对应一个MapTask,每一个MapTask对应一个缓冲区
  5.缓冲区本质上是一个字节数组
  6.缓冲区又叫环形缓冲区,好处在于可以重复利用同一块地址的缓冲区
  7.阈值的作用是避免Spill过程产生阻塞
  8.merge过程可能不会发生

Reduce中的shuffle:
  1.ReduceTask启动多个后台线程发起HTTP请求抓取数据----fetch
  
  2.当前的ReduceTask值抓取对应分区的数据
  
  3.RedcueTask从不同的MapTask上抓取了大量的数据,然后对这些数据进行merge(因为每个MapTask中合并的文件中有各个分区的数据)
  
  4.在merge过程中,会对数据进行一次排序,保证当前分区中的数据有效(在这之后会进行一次分组过程)
  
  5.Merge之后数据要进行一次分组(group),将相同的键所对应的值放到一个ArrayList
  
  6.将ArrayList传递到Reducer中,Reducer将ArrayList转化为一个迭代器传到Reduce方法中
  
  在Reduce中需要注意:
  1.fetch的线程数量默认为5个
  2.ReduceTask在启动的时候有一个阈值,这个阈值时表示有几个MapTask
  3.执行完成之后就要启动ReduceTask,阈值默认时0.05(当有5%的mapTask执行完成之后,启动ReduceTack)
  4.merge因子是10(默认十个合一个);

那么Shuffle调优就很重要的,主要有以下的方式:

Reduce阶段:
  1.增加fetch线程的数量
  2.减小reduceTask的阈值—尽量不要动
  3.调大merge因子
Mapper阶段:
  1.调大缓冲区。建议在250—400M
  2.指定combiner减少数据量
  3.压缩数据以减少网络传输过程中的时间消耗(这种方式实际上是在网络和内存之间进行了取舍)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HadoopShuffle 原理是将 Map 阶段处理后生成的中间结果重新排序并分组,以便在 Reduce 阶段进行进一步处理。Shuffle 过程主要包括三个步骤:Partitioning,Sorting 和 Combining。 Partitioning:将 Map 阶段的输出数据按 Key 分别分配到不同的 Reducer 上。 Sorting:对于每一个 Reducer,将分配到其上的所有数据按 Key 值排序。 Combining:在排序之后,Shuffle 还可以对数据进行合并,以减少数据传输量。 Shuffle 过程是 HadoopMapReduce 计算模型的核心,对于数据处理效率和最终结果的准确性都有着至关重要的影响。 ### 回答2: Hadoop是一种分布式计算框架,其中的shuffle操作是用于在Map阶段和Reduce阶段之间对数据进行重组和重新分配的过程。 在HadoopMapReduce模型中,Mapper用于将输入数据按照一定的逻辑进行处理,并输出键值对。然后,Shuffle过程会将Mapper的输出结果根据键值对中的键值进行分组,并将具有相同键值的数据发送给同一个Reducer。 Shuffle过程通常分为三个阶段: 1. Map阶段:Mapper将输入数据划分为若干个片段,每个片段由一个或多个键值对组成,这些片段会根据键值对中的键进行排序并划分到不同的Reducer上。 2. Shuffle阶段:在Map阶段结束后,Shuffle阶段将根据键值对中的键值进行分组,并按照键值对的键进行排序。具有相同键值的数据会被发送到同一个Reducer上,以供后续的Reduce阶段进行处理。 3. Reduce阶段:Reducer接收来自Shuffle阶段的数据,并按照键值对中的键进行处理和计算。每个Reducer会处理一个或多个键值对的组合,最终输出最终结果。 Shuffle过程的实现通常包含了数据的排序、分组和网络传输等操作。数据排序可以确保相同键值的数据聚集在一起,方便后续的处理。数据分组可以将具有相同键值的数据发送到同一个Reducer上,以便进行进一步的计算。而数据的网络传输则是将数据从Mapper发送到Reducer的过程,需要在网络中进行高效的数据传输。 总之,HadoopShuffle原理是利用MapReduce模型中的Mapper将数据进行初步处理,然后根据键值对的键进行分组和排序,最终将同一个键值的数据发送给同一个Reducer,以实现分布式计算的功能。 ### 回答3: HadoopShuffle是指在MapReduce过程中的数据重组和重新分配的过程。在MapReduce中,Map任务将输入数据进行处理并生成临时键值对,然后将这些键值对按照指定的规则进行分区并发送给Reduce任务进行进一步处理。Shuffle阶段就是将Map任务生成的键值对进行重新分配和分组的过程。 具体来说,Shuffle过程包括三个主要的步骤:分区(Partitioning)、排序(Sorting)和合并(Merging)。 首先,分区步骤是将Map任务生成的键值对按照指定的分区规则进行划分,并将属于同一个分区的键值对发送给同一个Reduce任务。分区的目的是为了将相同键的键值对发送给同一个Reduce任务,以便进行后续的处理。 接下来,排序步骤是对同一个分区内的键值对进行排序,以便Reduce任务在后续的合并和处理过程中能够更高效地进行运算。排序可以提高Reduce任务的性能,使得相同键的键值对可以紧凑地存在一起,减少数据的读写次数和网络传输量。 最后,合并步骤是将各个Map任务产生的分区文件进行合并,将相同键的键值对进行聚合,以减少数据的传输量。合并操作可以在传输过程中减少数据的大小,提高整体的效率和性能。 总的来说,HadoopShuffle过程是将Map任务产生的键值对按照指定规则进行分区、排序和合并的过程,确保相同键的键值对能够被发送到同一个Reduce任务进行处理。Shuffle的优化可以提高整体的MapReduce计算性能,减少数据的传输量和网络开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值