前言

  • 据说,自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计算公式

由上一节图可知,最终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~

Hadoop源码解析之Mapper数量计算公式相关推荐

  1. MapReduce源码解析之Mapper

    MapReduce源码解析之Mapper 北京易观智库网络科技有限公司 作者:贺斌 摘要:详解MapReduce中Map(映射)的实现者Mapper. 导语: 说起MapReduce,只要是大数据领域 ...

  2. Hadoop源码解析之: TextInputFormat如何处理跨split的行

    Hadoop源码解析之: TextInputFormat如何处理跨split的行 转载于:https://blog.51cto.com/taikongren/1742425

  3. Hadoop源码解析

    一.hadoop的Job 提交流程源码 流程图: 1.从我们编写的mapreduce的代码中进入job提交源码 支线一:进入connect(); 2.支线二:进入submitter.submitJob ...

  4. hadoop源码解析---INodeReference机制

    本文主要介绍了hadoop源码中hdfs的INodeReference机制. 在hdfs2.6版本中,引入了许多新的功能,一些原有的源代码设计也有一定的改造.一个重要的更新就是引入了快照功能.但是当H ...

  5. 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 http://www.iocoder.cn/Eureka/instance-registry-evict/ ...

  6. 2015.07.20MapReducer源码解析(笔记)

    MapReducer源码解析(笔记) 第一步,读取数据源,将每一行内容解析成一个个键值对,每个键值对供map函数定义一次,数据源由FileInputFormat:指定的,程序就能从地址读取记录,读取的 ...

  7. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  8. 以太坊Geth 共识算法源码解析

    共识算法 目前以太坊中有两个公式算法的实现,分别为clique和ethash.其中clique是PoA共识的实现,ethash是PoW共识的实现,其相应的代码位于go-ethereum/consens ...

  9. React深入学习与源码解析笔记

    ***当前阶段的笔记 *** 「面向实习生阶段」https://www.aliyundrive.com/s/VTME123M4T9 提取码: 8s6v 点击链接保存,或者复制本段内容,打开「阿里云盘」 ...

最新文章

  1. 生成可执行jar文件
  2. php类实例方法静态方法,PHP类中的静态方法使用实例
  3. javax.websocket.DeploymentException: The path [webScoketServiceBaidu/{appID}] is not valid.
  4. C# 正则表达式验证
  5. 抛开约束,增强模型:一行代码提升 ALBERT 表现
  6. 服务器自检后显示scsi,请问一下,如何检测SCSI +RAID 5设置是否正确??
  7. SAP Gateway service language determination
  8. Codeforce-CodeCraft-20 (Div. 2)-B. String Modification (找规律+模拟)
  9. 华为服务器装系统怎么选pxe,华为TaiShan服务器PXE操作系统
  10. “入圈”高端大获成功!小米10至尊版上市首月霸榜京东、天猫5000元以上档销量第一...
  11. 视频质量,分辨率,码率之间的关系 2
  12. BZOJ——T 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛
  13. 一博商业进销存管理系统 v2008 怎么用
  14. 人行发布2018年度银行科技发展获奖名单
  15. Windows下使用c++编译hiredis.lib,Win32_Interop.lib
  16. PCA主成分分析(原理+例子)
  17. 《Pro SQL Server Internals, 2nd edition》节选翻译(4)
  18. B站马士兵python入门基础版详细笔记(6)
  19. 介绍几款可用的web应用防火墙
  20. (03)格式化输入和输出

热门文章

  1. 传统零售业分析指标|数据化管理笔记
  2. ubuntu下右键无法打开终端(open in terminal)的解决办法
  3. 【Unity】用Excel库读取Excel表格(.xlsx或者.xls)
  4. iOS多线程同时操作同一内存造成野指针
  5. 秉持H2H理念,58同城如何在移动互联网时代开拓市场
  6. 智能化整体图例,布线、安防、广播会议、电视、楼宇、消防、电气图的图例【转自微信公众号弱电课堂】
  7. cyberdefenders------------Insider
  8. 【OpenCV】透视变换 仿射变换
  9. 【计量经济学】跨时期横截面的混合
  10. ROS下阿克曼转向结构车型导航应用实践(teb_local_planner)