mapreduce-shuffling

mapreduce-shufflingmap->reducemap和reduce之间的过程,成为shuffling,官方图是这样介绍的.(这样描述不是很准确)MapTask每个map任务都有一个环形内存缓冲区用于存储任务的输出.默认100MB(MRJobConfig.IO_SORT_MB修改)一旦缓冲达到阈值(MRJobConfig.MAP_SORT_SPILL_PERCENT)0.8,后台

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

map->reduce

map和reduce之间的过程,成为shuffling,官方图是这样介绍的.(这样描述不是很准确)

Jetbrains全家桶1年46,售后保障稳定

这里写图片描述

MapTask

每个map任务都有一个环形内存缓冲区用于存储任务的输出.默认100MB(MRJobConfig.IO_SORT_MB修改)
一旦缓冲达到阈值(MRJobConfig.MAP_SORT_SPILL_PERCENT)0.8,后台线程将内容spill到硬盘,将缓缓冲区写到MRJobConfig.JOB_LOCAL_DIR指定目录.
查看MRJobConfig.JOB_LOCAL_DIR值为mapreduce.job.local.dir,查看org.apache.hadoop.mapreduce包下的mapred-default.xml(hadoop-mapreduce-client-core.2.7.1.jar中)文件搜索local.dir,得到配置

<property>
  <name>mapreduce.cluster.local.dir</name>
  <value>${hadoop.tmp.dir}/mapred/local</value>
  <description>The local directory where MapReduce stores intermediate
  data files.  May be a comma-separated list of
  directories on different devices in order to spread disk i/o.
  Directories that do not exist are ignored.
  </description>
</property>

ok,现在从hadoop-common-2.7.1.jar中的core-default.xml中搜索hadoop.tmp.dir

<property>
  <name>hadoop.tmp.dir</name>
  <value>/tmp/hadoop-${user.name}</value>
  <description>A base for other temporary directories.</description>
</property>

现在我们得到了spill的临时路径/tmp/hadoop-${user.name}/mapred/local.

在spill之前,首先进行partition,每个分区进行sort,如果有combiner,它就在排序后,执行combiner。

如果溢出文件超过三个(JobContext.MAP_COMBINE_MIN_SPILLS),将会再次执行combiner

MapTask.MapOutputBuffer中源码

if (combinerRunner == null || numSpills < minSpillsForCombine) {
    Merger.writeFile(kvIter, writer, reporter, job);
} else {
    combineCollector.setWriter(writer);
    combinerRunner.combine(kvIter, combineCollector);
}

注: map spill到磁盘时,可以设置压缩来节省磁盘和网络IO
设置 MAP_OUTPUT_COMPRESS 为true ,MRJobConfig.MAP_OUTPUT_COMPRESS_CODEC值为codec
例如:
conf.set(MRJobConfig.MAP_OUTPUT_COMPRESS, "true");
conf.set(MRJobConfig.MAP_OUTPUT_COMPRESS_CODEC, "org.apache.hadoop.io.compress.DefaultCodec");

ReduceTask

ReduceTask要从各个MapTask上读取数据,ReduceTask大体流程分为5个阶段。
  1. Shuffle
    ReduceTask从MapTask上远程拷贝数据。超过阈值写道磁盘。
  2. Merge
    ReduceTask启动两个线程,对内存和硬盘数据进行合并。
  3. Sort
    将MapTask的结果归并排序。
  4. Reduce
    用户自定义Reduce
  5. Write
    reduce结果写到HDFS

    源码分析

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226581.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kong网关教程_网关怎么登陆

    kong网关教程_网关怎么登陆网关是微服务中不可或缺的一部分,它承载了所有请求流量入口,参数验证拦截,用户权限验证,但是除了JAVA的springcloud之外,公共网关屈指可数,其中最受关注的就是KONG了,笔者半年前就已经在使用kong的那时候使用的是0.11.2-bate版本(之前还被官方坑了一次),前不久终于等到了1.X的正式版发布了,笔者就在这里给大家分享一下kong网关的基本情况以及使用安装的方式。附上:喵…

    2022年9月10日
    0
  • WebGame开发

    WebGame开发web策略类游戏开发(六)缓存概述 公布一个小webgame代码 webgame创意之《吞噬者》 webgame创意之《超时空要塞之边境》 webgame创意之《坐庄》 web策略类游戏开发(五)数据库表设计web策略类游戏开发(四)一个可以承载万人在线的架

    2022年5月2日
    80
  • panda’_pandas map

    panda’_pandas mappandas.DataFrame.iloc()纯基于位置的整数索引输入格式:一个整数列表或数组,如[4,3,0]。一个带有int类型的slice对象,例如1:7。一个布尔值数组。一个具有一个参数的可调用函数,返回索引案例mydict=[{‘a’:1,’b’:2,’c’:3,’d’:4},{‘a’:100,’b’:200,’c’:300,’d’:400},{‘a’:1000,’b’:2000,’c’:30

    2022年8月30日
    0
  • java初中级面试题集锦

    java初中级面试题集锦目录基础&与&&区别使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?静态变量和实例变量的区别?是否可以从一个static方法内部发出对非static方法的调用?”==”和equals方法究竟有什么区别?int和Integer的区别什么是foreach循环,它可以循环那些数据类型重载与重写区别?…

    2022年6月18日
    28
  • 线程有哪些属性_thread runnable callable区别

    线程有哪些属性_thread runnable callable区别1、当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALSE的。2、当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行结束。3、只有IsBackground=TRUE的线程才会随着主线程的退出而退出。4、当初始化一个线程,把Thread.IsBackground=true的时候,指示该线程为后台线程。后台线程将会随着主线程的退出而退出。5、原理:只要所有前台线程都终止后,CLR就会对每一个活在的后台线程调用Abort()

    2022年10月17日
    0
  • html错误(一) Stack Overflow at line:0 IE下解决方案

    html错误(一) Stack Overflow at line:0 IE下解决方案一今天用IE测试发现一个很奇葩的问题:代码没有什么问题,但是在浏览器中会自动弹出一个错误如: 二错误原因分析2.1  重定义了系统的触发事件名称作为自定义函数名如: onclick/onsubmit… 都是系统保留的事件名称,不允许作为重定义函数名称。2.2 出现死循环,都提示:Stackoverflowatline:0,如:在图片对象定

    2022年7月15日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号