Hadoop源码解析之Mapper数量计算公式

news/2024/5/5 5:11:52/文章来源:https://blog.csdn.net/m0_59092234/article/details/126595910

前言

  • 据说,自0.20.0版本开始,Hadoop同时提供了新旧两套MapReduce API,并在后续版本中也同时支持这两种API的使用。新版本MR API在旧的基础进行了扩展,也制定了新的split计算方式。新版本MR API在包org.apache.hadoop.mapreduce及其子包中,而旧版本MR API则在包org.apache.hadoop.mapred及其子包中。
  • 本文主要从源码角度,简单谈谈新旧MR API中常用的FileInputFormat类(TextInputFormat的父类)中分片Split的计算方式,可以以此来确定每次MR的Mapper个数,默认情况下Mapper的个数即等于分片Split个数。

新旧MapReduce API的作业配置方式对比

旧API 作业配置实例:

JobConf job = new JobConf(new Configuration(), MyJob.class);
job.setJobName("myjob");
job.setMapperClass(MyJob.MyMapper.class);
job.setReducerClass(MyJob.MyReducer.class);
JobClient.runJob(job);

新API 作业配置实例:

Configuration conf = new Configuration();
Job job = new Job(conf, "myjob ");
job.setJarByClass(MyJob.class);
job.setMapperClass(MyJob.MyMapper.class);
job.setReducerClass(MyJob.MyReducer.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);

分片Split计算过程

在提交MR Job时,JobsetUseNewAPI方法中根据设置的Mapper类来确定设置参数"mapred.mapper.new-api"的值,如果是使用的是旧版API,则此参数为false,否则为true;
然后JobSubmitter会根据参数"mapred.mapper.new-api"的值来判断,是使用旧版还是新版API中的getSplits方法来确定分片Split。

分片Split计算过程


分片Split计算公式

由上一节图可知,最终SplitSize的计算,在旧版本API中由org.apache.hadoop.mapred.InputFormat#getSplits方法决定,在新版本API中由org.apache.hadoop.mapreduce.InputFormat#getSplits方法决定。


旧版本FileInputFormat中分片大小splitsSize计算公式

通过查看org.apache.hadoop.mapred.FileInputFormat中的getSplits方法,可以得出对应的SplitSize计算公式:

Math.max(minSize,Math.min(goalSize,blockSize))

PS:

goalSize等于所有输入文件的总大小除以参数"mapreduce.job.maps"的值(此参数默认值为1,可以在 mapred-site.xml 文件中配置);

blockSize指的是当前文件在HDFS中存储时的BLOCK大小(可以通过在 hdfs-site.xml 文件中设置"dfs.block.size"或者"dfs.blocksize"参数来调整之后新生成的HDFS文件BLOCK大小);

minSize为参数"mapreduce.input.fileinputformat.split.minsize"的值(此参数默认值为1,可以在 mapred-site.xml 文件中配置)。


新版本FileInputFormat中分片大小splitsSize计算公式

通过查看org.apache.hadoop.mapreduce.lib.input.FileInputFormat中的getSplits方法,可以得出对应的SplitSize计算公式:

Math.max(minSize,Math.min(maxSize,blockSize))

PS:

minSize等于参数"mapreduce.input.fileinputformat.split.minsize"的值(此参数默认值为1,可以在 mapred-site.xml 文件中配置);

maxSize为参数"mapreduce.input.fileinputformat.split.maxsize"的值(此参数默认值为Long.MAX_VALUE,即0x7fffffffffffffffL,可以在 mapred-site.xml 文件中配置);

blockSize指的是当前文件在DFS中存储时的BLOCK大小(可以通过在 hdfs-site.xml 文件中设置"dfs.block.size"或者"dfs.blocksize"参数来调整之后新生成文件的BLOCK大小)。


分片规则

当一个文件的剩余未分片大小除以splitSize大于1.1(即超过splitSize的10%)时,则认为文件大小“溢出”,需要切割分成多个分片,每切割一次,剩余未分片大小减少splitSize;否则则将整个剩余未分片的内容作为单个分片。


FileInputFormat分片数量计算

对于输入路径中的每个文件都应用split分片规则来对其进行分片,每个文件至少切成一个Split(如果文件内容为空,大小为0,则创建空分片Split)。


Mapper个数的确定

默认情况下,Mapper的个数即等于最终的分片个数

旧版本API:

可以通过修改"mapreduce.job.maps""mapreduce.input.fileinputformat.split.minsize""dfs.blocksize" 参数来调整分片大小splitSize来调整最终分片个数,进而调整Mapper数量。

根据旧版API中splitSize计算公式,当goalSize小于blockSize,大于minSize时,Mapper数量大致等于参数"mapreduce.job.maps"的值。

新版本API:

可以通过修改"mapreduce.input.fileinputformat.split.minsize""mapreduce.input.fileinputformat.split.maxsize""dfs.blocksize" 参数来调整分片大小splitSize来调整最终分片个数,进而调整Mapper数量。

根据新版API中splitSize计算公式,一般情况下通过适当减小"mapreduce.input.fileinputformat.split.maxsize"的值,并使其置于minSize与blockSize之间,则可以减小分片大小splitSize,来增加最终分片个数,进而增加Mapper数量。


End~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_3418.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基于Django的汽车销售网站

本汽车销售商城采用的数据库是Mysql,使用Django框架开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 汽车销售商城主要是为了提高工作人员的工作效率和更方便快捷的满足用户…

Win7下安装Docker(虚拟机win7)

在虚拟机VM里面安装一个win7用于安装Docker docker-toolbox-windows-docker-toolbox安装包下载_开源镜像站-阿里云 直接下载圈起来的这个就好了 直接拷贝到虚拟机系统win7里面安装,全部勾起来直接下一步安装即可 安装好后,会有三个图标 直接点击Dock…

自动化情侣微信早报信息定时推送

文章目录一、效果展示二、配置config.txt(重点)2.1 填写appID和appsecret2.1 创建测试模板填写template_id2.4 填写user2.5 填写weather_key2.6 填写剩下其他框选内容即可三、运行软件3.1 选择config.txt文件并设定时间3.2 运行软件3.3 效果展示一、效果…

12种解决CSS旧问题的新技巧

如果您一直在使用CSS,那么很可能会遇到一些布局或跨浏览器兼容性等问题。例如,CSS3的样式不太适用于IE的某些旧版本。而有时候,当我们准备使用某项功能时,却发现它无法广泛地得到各种浏览器的行为支持。因此,在从事Web…

第13章Linux实操篇-进程管理(重点)

第13章Linux实操篇-进程管理(重点) 文章目录第13章Linux实操篇-进程管理(重点)13.1基本介绍13.2显示系统执行的进程13.2.1基本介绍13.2.2ps详解13.2.3应用实例13.3终止进程kill和killall13.3.1介绍13.3.2基本语法13.3.3最佳实践13.4查看进程树pstree13.4.1基本语法13.4.2常用选…

Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第12章 Vue3.X新特性解析 12.1 Vue3.0 新特性

Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 文章目录Vue.js核心技术解析与uni-app跨平台实战开发学习笔记第12章 Vue3.X新特性解析12.1 Vue3.0 新特性第12章 Vue3.X新特性解析 12.1 Vue3.0 新特性 Vue3.0 中需要重点关注的两个新特性: 双向数据绑定的原…

JVM资料阅读笔记总结-1

前言 最近读周志明的《深入理解Java虚拟机》以及半栈工程师的Java虚拟机文章,对JVM又重新复习了一遍,每次看后收获都不一样(因为没有debug能力,还是很懵懂),担心会忘记将自己读后总结记录下来 总结内容 j…

期货开户止损是通向成功的保障

一、情绪波动止损法: 如果买入股票后,感觉不好,寝食难安,这说明自己认为买入理由不充分或信心不足,这将影响今后的正常操作,故应果断卖出离场。 二、空间位移止损法: 1、 初始止损法&#xf…

调用MapReuce对文件中各单词出现次数统计

调用MapReduce对文件中各单词出现次数统计 调用MapReuce对文件中各单词出现次数统计一、安装环境二、需求分析 1.创建hadoop账户2.设置Hadoop密码3.为Hadoop用户增加管理员权限4.更新apt5.安装vim6.安装SSH、配置SSH无密码登陆 三、安装java环境 1.安装JDK2.验证JDK安装情况3.…

SpringBoot 启用 GZIP 对响应进行压缩

SpringBoot Web 应用默认是不启用响应数据的压缩,对大的文本类型的响应数据进行压缩是十分必要的,如 JSON, XML 等应用数据,甚至是 JS, CSS 等。 早先的 Web 应用基本是要配置一个叫做 GzipFilter 之类的东西,然后判断请求的 Acc…

Windows与网络基础-1-2-虚拟机安装Windows10和window server2016

目录 一、虚拟机安装软件和ios镜像文件 二、新建虚拟机 2.1 文件—>新建虚拟机 2.2 选择典型安装 2.3 选择稍后安装 2.4 选择操作系统类型和版本 2.5 虚拟机名称和安装路径 2.6 指定磁盘大小 2.7 配置硬件信息 2.8 进入系统安装界面 2.9 选择系统版本 2.10 选择自…

LeetCode精选200道--二叉树篇(二)

二叉树篇(二)前言完全二叉树的节点个数普通二叉树逻辑递归完全二叉树逻辑平衡二叉树题外话递归二叉树的所有路径思路递归相同的树100. 相同的树另一棵树的子树左叶子之和思路找树左下角的值思路112. 路径总和思路106. 从中序与后序遍历序列构造二叉树根据…

FLASH:一种高效的Transformer设计

背景 近年来,Transformer凭借其优秀的设计,在文本、图像、语音等方向大杀四方。但是由于其attention的二次复杂度限制了其在长序列上的应用。本文提出了一种快(速度快)、省(省显存)的模型FLASH(Fast Linear Attention with a Single Head),在…

SpringBoot 和 Vue前后端分离在线工具项目实战,源码+超详细讲解

一、前言 主要通过SpringBoot和Vue来实现一个前后端分离的在线工具平台,包含PDF转换、图片处理、文本处理、图表展示、二维码工具等功能。 为了更直观展示项目效果,也给大家提供了在线体验地址:http://49.234.28.149, 源码资源见文末。 通过…

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 无效的绑定语句(未找到),就是写的sql 方法找不到sql。解决: 1 namespace 指向是否正确 路径与引用的方法的路径保持一致a.namespace 没有指向Dao b. id ,方法名没有对应上2 引用的方法…

记录Kettle连不上mysql8

如图所示,mysql升级到8了。 在很早之前,我一直用的是Mysql 5的驱动包去连接数据库,今天发现突然连接不上了,想了一下,应该是我以前升级mysql后的原因,换了mysql8的驱动后依旧没个卵用。 报错如下&#xff…

远程Debug远端服务器JVM配置

远程调试非本机的Java进程 远端Java进程启动的JVM参数 注意:以下配置尽量不要在线上生产环境开启,或者 JDK4: -Xdebug -Xrunjdwp:transportdt_socket,servery,suspendn,address{port} JDK5-JDK8: -agentlib:jdwptransportdt_socket,servery,suspen…

Python——LeetCode刷题——【383. 赎金信】

题目描述: 解题思路: 用字典记录字符串magazine中每个字符出现的次数。然后看看字典中magazine的各个字符的出现次数是否“够”字符串ransomNote中各个字符出现的次数。如果够,return True。如果存在有点字符不够,return False。…

学习:Python进阶 冒泡排序

#原理 列表每两个相邻的数,如果前面的数比后面的数大,则交换这两个数 一趟排序完成后,则无序曲减少一个数,有序区增加一个数 每循环一趟,从无序区冒出来一个最大的数,放入有序区,最终得到一个升序的列表

认真研究ConcurrentHashMap中的元素统计策略

这里我们想研究的是jdk1.8中ConcurrentHashMap的addCount(long x, int check)方法。如下所示在put方法的最后会触发addCount(long x, int check)方法进行元素个数的统计。 我们再回顾一下另一个参数binCount : 在操作链表的分支if (fh > 0)中 用于统计put前链表…