MergeManagerImpl 类

内存参数计算

maxInMemCopyUse

位于构造函数中

    final float maxInMemCopyUse =
jobConf.getFloat(MRJobConfig.SHUFFLE_INPUT_BUFFER_PERCENT,
MRJobConfig.DEFAULT_SHUFFLE_INPUT_BUFFER_PERCENT);
if (maxInMemCopyUse > 1.0 || maxInMemCopyUse < 0.0) {
throw new IllegalArgumentException("Invalid value for " +
MRJobConfig.SHUFFLE_INPUT_BUFFER_PERCENT + ": " +
maxInMemCopyUse);
}

这个参数就是reducer端shuffle输入缓冲占JVM堆的比例即参数:mapreduce.reduce.shuffle.input.buffer.percent,默认为0.7f

memoryLimit

位于构造函数中,memoryLimit一般情况下就是reducer端输入缓冲的大小,由比例值和JVM堆大小相乘得出。

    // Allow unit tests to fix Runtime memory
this.memoryLimit =
(long)(jobConf.getLong(MRJobConfig.REDUCE_MEMORY_TOTAL_BYTES,
Math.min(Runtime.getRuntime().maxMemory(), Integer.MAX_VALUE))
* maxInMemCopyUse);

但是仔细观察代码发现它没有直接将Runtime.getRuntime().maxMemory()maxInMemCopyUse相乘,而是对前者和Integer.MAX_VALUE取了个最小值,这个设计还是挺令人费解的。不过这是在没有设定REDUCE_MEMORY_TOTAL_BYTES(mapreduce.reduce.memory.totalbytes)参数的情况下,如果设定了那么会忽略后面的值。注释中其实也给了一些说明,但是只是为了针对unit tests来fix这个问题。但是个人觉得实际中还是可能会有这样的大内存需求的情况出现,来提高copy-merge速度。

maxInMemReduce

位于最后一轮merge(finalMerge)过程中的计算,这个参数表示reduce开始后,保留给shuffle数据占JVM堆大小。如果reducer不需要太占内存的话,可以让这个值大一点,这样就可以减少写入磁盘的记录数,reducer可以直接从内存获取输入。

    final float maxRedPer =
job.getFloat(MRJobConfig.REDUCE_INPUT_BUFFER_PERCENT, 0f);
if (maxRedPer > 1.0 || maxRedPer < 0.0) {
throw new IOException(MRJobConfig.REDUCE_INPUT_BUFFER_PERCENT +
maxRedPer);
}
int maxInMemReduce = (int)Math.min(
Runtime.getRuntime().maxMemory() * maxRedPer, Integer.MAX_VALUE);

maxRedPer对应与参数mapreduce.reduce.input.buffer.percent(旧版为mapred.job.reduce.input.buffer.percent),即保留给shuffle数据空间占堆的比例,接着又开始发生坑爹的逻辑了又要把上限设定为Integer.MAX_VALUE了,不过这里我们看出一些端倪,是不是因为原来结构中maxInMemReduce对应的数据类型是int而不是long造成了目前这种奇异的逻辑。这次没有什么方法可以突破这个限制,也就是说当shuffle数据超过2GB后,无论如何调整io.sort.factormapreduce.reduce.input.buffer.percent都将使得超过2GB大小的数据写到磁盘上,即使分配了足够的堆空间。

最新文章

  1. MySQL 显示命令
  2. [ASE][Daily Scrum]11.30
  3. C#窗体自定义控件
  4. struts2学习笔记之二:基本环境搭建
  5. [SHELL进阶] (转)最牛B的 Linux Shell 命令 (三)
  6. box2dweb基础
  7. Uva 10305 给任务排序
  8. 在iOS中创建静态库
  9. C#入门经典第十章接口的实现
  10. vs2015添加ActiveX Control Test Container工具(转载)
  11. python增量爬虫pyspider
  12. Lua的 table.sort排序
  13. 【Devops】【docker】【CI/CD】1.docker搭建Gitlab环境
  14. 配置Eclipse 3.3 + tomcat 6.0 + lomboz 3.3进行Web开发
  15. [转]ViewPager学习笔记(一)——懒加载
  16. HttpHelp 请求帮助类
  17. Vue2.0 render:h =&gt; h(App)
  18. 如何打印加密的PDF文件?
  19. 【转】web测试技术经典案例(基础、全面)
  20. css深入理解之 border

热门文章

  1. Swift5 语言指南(二十二) 扩展
  2. 关于AOP的PIAB
  3. 04-01 Java switch、for、while、do while语句,循环嵌套,跳转语句break、continue、return
  4. Oracle 查看当前数据库版本的方法
  5. 全网最详细的U盘被损坏导致一般性的软件无法修复的解决办法(必须可以)(图文详解)
  6. 全网最详细的hive-site.xml配置文件里如何添加达到Hive与HBase的集成,即Hive通过这些参数去连接HBase(图文详解)
  7. 【JAVA】内部类,内部接口
  8. Python -- 多媒体编程 -- 音乐播放
  9. 配置Codis-Service主机
  10. Linux-(ping,traceroute,ss)