Hadoop_18_MapRduce 内部的shuffle机制
1.Mapreduce的shuffle机制:
Mapreduce中,map阶段处理的数据如何传递给Reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle
将maptask处理后的输出结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序
MapReduce程序的执行过程分为两个阶段:Mapper阶段和Reducer阶段。
1.MapReduce的Map阶段:
1.1.从HDFS读取数据:
由FileInputFormat实现类的getSplits()方法将待处理数据执行逻辑切片,默认切片的类为FileInputFormat,通过切片
输入文件将会变成split1、split2、split3……随后对输入切片split按照一定的规则解析成键值对<k1,v1>,在MapTask进行读取
数据时,其中默认处理的类为TextInputFormat,并通过记录读取器RecordReader的read()方法一次读取一行,并返回key和
value,其中k1就是读到的一行文本的起始偏移量,v1就是行文本的内容。
调用自己编写的Map逻辑,Maptask会对每一行<k1,v1>输入数据调用一次我们自定义的map()方法,
Map使用context.write输出键值对<k2,v2>,其输出结果由OutPutCollector将每个Map任务的键值对输出到内存所构造
的一个环形缓冲区中,其数据结构其实就是个字节数组,叫Kvbuffer,Mapper中的Kvbuffer的大小默认100M,spill一般会在
Buffer空间大小的80%开始进行spill溢出到文件,在溢出之前,按照一定的规则对输出的键值对<k2,v2>进行分区:分区的规
则是针对k2进行的,比如说k2如果是省份的话,那么就可以按照不同的省份进行分区,同一个省份的k2划分到一个区,注意:
默认分区的类是HashPartitioner类,这个类默认只分为一个区,因此Reducer任务的数量默认也是1.注意:如reduce要求得
到的是全局的结果,则不适合分区!然后再对每个分区中的键值对进行排序;注意:所谓排序是针对k2进行的,v2是不参与排
序的,如果要让v2也参与排序,需要自定义排序的类,此时得到的溢出文件分区且区内有序;不断溢出,不断形成溢出文件;
在MapTask结束前会对这些spill溢出文件进行归并排序Merge,形成MapTask的最终结果文件
注:Combiner存在的时候,此时会根据Combiner定义的函数对map的结果进行合并
由于job的每一个map都会根据reduce(n)数将数据输出结果分成n个partition,hadoop中是等job的第一个map结束后,
所有的reduce就开始尝试从完成的map中下载该reduce对应的partition部分数据(网络传输)到ReduceTask的本地磁盘工作
目录,当所有map输出都拷贝完毕之后,所有数据被最后合并成一个整体有序的文件,作为reduce任务的输入,Reducetask
真正进入reduce函数的计算阶段
Reduce在这个阶段,框架为已分组的输入数据中的每个 <key, (list of values)>对调用一次 reduce()方法。Reduce
任务的输出通常是通过调用 OutputCollector.collect(WritableComparable,Writable)写入文件系统
注意:Shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速
度就越快缓冲区的大小可以通过参数调整, 参数:io.sort.mb 默认100M
2.Mapreduce中的Combiner:
(1)combiner是MR程序中Mapper和Reducer之外的一种组件
(2)combiner组件的父类就是Reducer
(3)combiner和reducer的区别在于运行的位置:
Combiner是在每一个maptask所在的节点运行
Reducer是接收全局所有Mapper的输出结果;
(4) combiner的意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量
具体实现步骤:
1、 自定义一个combiner继承Reducer,重写reduce方法
2、 在job中设置: job.setCombinerClass(CustomCombiner.class)
(5) combiner能够应用的前提是不能影响最终的业务逻辑而且,combiner的输出kv应该跟reducer的输入kv类型要
对应起来
Combiner的使用要非常谨慎因为combiner在mapreduce过程中可能调用也肯能不调用,可能调一次也可能调多次所以:
combiner使用的原则是:有或没有都不能影响业务逻辑
参考文章:https://blog.csdn.net/aijiudu/article/details/72353510
Hadoop_18_MapRduce 内部的shuffle机制的更多相关文章
- Hadoop(17)-MapReduce框架原理-MapReduce流程,Shuffle机制,Partition分区
MapReduce工作流程 1.准备待处理文件 2.job提交前生成一个处理规划 3.将切片信息job.split,配置信息job.xml和我们自己写的jar包交给yarn 4.yarn根据切片规划计 ...
- Shuffle 机制
1. 概述 Map 方法之后,Reduce 方法之前的数据处理过程称之为 Shuffle. 2. Partition 分区 需求:要求将统计结果按照条件输出到不同文件中(分区).比如:将统计结果按照手 ...
- shuffle机制和TextInputFormat分片和读取分片数据(九)
shuffle机制 1:每个map有一个环形内存缓冲区,用于存储任务的输出.默认大小100MB(io.sort.mb属性),一旦达到阀值0.8(io.sort.spill.percent),一个后台线 ...
- 【Spark】Spark的Shuffle机制
MapReduce中的Shuffle 在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性 ...
- Qt 的内部进程通信机制
Qt 的内部进程通信机制 续欣 (xxin76@hotmail.com), 博士.大学讲师 2004 年 4 月 01 日 Qt 作为一种跨平台的基于 C++ 的 GUI 系统,能够提供给用户构造图形 ...
- AsnycTask的内部的实现机制
AsnycTask的内部的实现机制 写在前面 我们为什么要用AsnycTask. 在Android程序开始运行的时候会单独启动一个进程,默认情况下所有 这个程序操作都在这个进程中进行.一个Androi ...
- MapReduce实例2(自定义compare、partition)& shuffle机制
MapReduce实例2(自定义compare.partition)& shuffle机制 实例:统计流量 有一份流量数据,结构是:时间戳.手机号.....上行流量.下行流量,需求是统计每个用 ...
- MapReduce(五) mapreduce的shuffle机制 与 Yarn
一.shuffle机制 1.概述 (1)MapReduce 中, map 阶段处理的数据如何传递给 reduce 阶段,是 MapReduce 框架中最关键的一个流程,这个流程就叫 Shuffle:( ...
- Spark Shuffle机制详细源码解析
Shuffle过程主要分为Shuffle write和Shuffle read两个阶段,2.0版本之后hash shuffle被删除,只保留sort shuffle,下面结合代码分析: 1.Shuff ...
随机推荐
- Flutter dio伪造请求头获取数据
在很多时候,后端为了安全都会有一些请求头的限制,只有请求头对了,才能正确返回数据.这虽然限制了一些人恶意请求数据,但是对于我们聪明的程序员来说,就是形同虚设.下面就以极客时间为例,讲一下通过伪造请求头 ...
- matlab boundaries和fchcode函数无法执行的解决办法 未定义与 'double' 类型的输入参数相对应的函数 'boundaries'
在测试代码时发现,自己的matlab无法执行Freeman链码函数: boundaries和fchcode函数都无法正常运行: 需要在自己的工作目录中添加如下函数: boundaries fchc ...
- Leetcode之236. Lowest Common Ancestor of a Binary Tree Medium
236. Lowest Common Ancestor of a Binary Tree Medium https://leetcode.com/problems/lowest-common-ance ...
- 读rfc HTTP 协议
这是IETF ( 国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF))制定的协议之一. 互联网工程任务组,成立于1985年底,是全球互联网最 ...
- 用Python给你的代码上个进度条吧 | 【代码也要面子的】
微信公众号:AI算法与图像处理如果你觉得对你有帮助,欢迎关注.转发以及点赞哦-( ̄▽ ̄-)~ 前言 最近在跑一些代码的时候,很烦...因为有时候不知道这段程序什么时候能执行完,现在执行哪里了,如果报错 ...
- Java学习笔记-函数
Java也有着函数的概念,不过在OOP中,函数用作方法称呼 函数的定义 函数就是定义在类中的具有特定功能的一段独立小程序 函数也称为方法 函数的格式 修饰符返回值类型函数名(参数类型形式参数1,参数类 ...
- 一个自己稍作修改了的美赛论文 LaTeX 模板
警告:这是旧版模板的发布页面.本站已经发布了最新版的美赛模板 easymcm(2020 年美赛可用),请到该页面查看: https://www.cnblogs.com/xjtu-blacksmith/ ...
- luogu P3031 [USACO11NOV]高于中位数Above the Median (树状数组优化dp)
链接:https://www.luogu.org/problemnew/show/P3031 题面: 题目描述 Farmer John has lined up his N (1 <= N &l ...
- 深度学习-LeCun、Bengio和Hinton的联合综述
深度学习其实要入门也很简单,不要被深度学习.卷积神经网络CNN.循环神经网络RNN等某些“高大上”的专有名词所吓到或被忽悠,要相信大道至简,一个高中生只要愿意学也完全可以入门级了解并依赖一些成熟的Te ...
- AndroidStudio下载安装教程(图文教程)
场景 Android Studio 中文社区: http://www.android-studio.org/ 下载安装包,这里选择64位Windows 等待下载完成. 注: 博客: https://b ...