MapReduce获取分片数目
问题
MapReduce Application中mapper的数目和分片的数目是一样的,可是分片数目和什么有关呢?
- 默认情况下。分片和输入文件的分块数是相等的。也不全然相等,假设block size大小事128M,文件大小为128.1M,文件的block数目为2。可是application执行过程中。你会发现分片数目是1,而不是2,当中的机理,后面会分析
- 有的程序会设置map的数目,那么map数目是如何影响分片的数目的呢?
- 假设文件大小为0,是否会作为一个分片传给map任务?
流程
- 通过listStatus()获取输入文件列表files,当中会遍历输入文件夹的子文件夹,并过滤掉部分文件。如文件_SUCCESS
- 获取全部的文件大小totalSIze
- goalSIze=totalSize/numMaps。
numMaps是用户指定的map数目
- files中取出一个文件file
- 计算splitSize。splitSize=max(minSplitSize,min(file.blockSize,goalSize)),当中minSplitSize是同意的最小分片大小。默觉得1B
- 后面依据splitSize大小将file分片。在分片的时候,假设剩余的大小不大于splitSize*1.1,且大于0B的时候。会将该区域整个作为一个分片。
这样做是为了防止一个mapper处理的数据太小
- 将file的分片增加到splits中
- 返回4。直到将files遍历完
- 结束。返回splits
源代码
public InputSplit[] getSplits(JobConf job, int numSplits)
throws IOException {
//获取输入文件列表files,当中会遍历输入文件夹的子文件夹,并过滤掉部分文件,如文件_SUCCESS
FileStatus[] files = listStatus(job); // Save the number of input files for metrics/loadgen
job.setLong(NUM_INPUT_FILES, files.length);
long totalSize = 0; // compute total size
for (FileStatus file: files) { // check we have valid files
if (file.isDirectory()) {
throw new IOException("Not a file: "+ file.getPath());
}
totalSize += file.getLen();
} /*
* numSplits为设置的map数目
* 期待的分片大小
*/
long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
/*
* FileInputFormat.SPLIT_MINSIZE为參数值:mapreduce.input.fileinputformat.split.minsize,默觉得0
* minSplitSize默觉得1
*/
long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize); // generate splits
ArrayList<FileSplit> splits = new ArrayList<FileSplit>(numSplits);
NetworkTopology clusterMap = new NetworkTopology();
for (FileStatus file: files) {
Path path = file.getPath();
long length = file.getLen();
if (length != 0) {
FileSystem fs = path.getFileSystem(job);
BlockLocation[] blkLocations;
if (file instanceof LocatedFileStatus) {
blkLocations = ((LocatedFileStatus) file).getBlockLocations();
} else {
blkLocations = fs.getFileBlockLocations(file, 0, length);
}
if (isSplitable(fs, path)) {
long blockSize = file.getBlockSize();
/*
* 计算分片的大小,每个文件都要计算一次
*computeSplitSize的计算公式为 Math.max(minSize, Math.min(goalSize, blockSize));
*/
long splitSize = computeSplitSize(goalSize, minSize, blockSize); long bytesRemaining = length;
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
String[] splitHosts = getSplitHosts(blkLocations,
length-bytesRemaining, splitSize, clusterMap);
splits.add(makeSplit(path, length-bytesRemaining, splitSize,
splitHosts));
bytesRemaining -= splitSize;
} if (bytesRemaining != 0) {
String[] splitHosts = getSplitHosts(blkLocations, length
- bytesRemaining, bytesRemaining, clusterMap);
splits.add(makeSplit(path, length - bytesRemaining, bytesRemaining,
splitHosts));
}
} else {
String[] splitHosts = getSplitHosts(blkLocations,0,length,clusterMap);
splits.add(makeSplit(path, 0, length, splitHosts));
}
} else {
//Create empty hosts array for zero length files
splits.add(makeSplit(path, 0, length, new String[0]));
}
}
LOG.debug("Total # of splits: " + splits.size());
return splits.toArray(new FileSplit[splits.size()]);
}
总结
看源代码还是非常实用的。非常多时候,博客或者书介绍的不是非常中肯,或者会有错误。看源代码就不会出现这些问题。
MapReduce获取分片数目的更多相关文章
- 实训任务05 MapReduce获取成绩表的最高分记录
实训任务05 MapReduce获取成绩表的最高分记录 实训1:统计用户纺问次数 任务描述: 统计用户在2016年度每个自然日的总访问次数.原始数据文件中提供了用户名称与访问日期.这个任务就是要获取 ...
- ios获取内核数目
#include <mach/mach_host.h> unsigned int countCores() { host_basic_info_data_t hostInfo; mach_ ...
- MapReduce中TextInputFormat分片和读取分片数据源码级分析
InputFormat主要用于描述输入数据的格式(我们只分析新API,即org.apache.hadoop.mapreduce.lib.input.InputFormat),提供以下两个功能: (1) ...
- Hadoop学习(4)-- MapReduce
MapReduce是一种用于大规模数据集的并行计算编程模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.其主要思想Map(映射)和Reduce(规约)都是从函数是编程语言中借鉴而来的 ...
- Mapreduce执行过程分析(基于Hadoop2.4)——(一)
1 概述 该瞅瞅MapReduce的内部运行原理了,以前只知道个皮毛,再不搞搞,不然怎么死的都不晓得.下文会以2.4版本中的WordCount这个经典例子作为分析的切入点,一步步来看里面到底是个什么情 ...
- Mapreduce运行过程分析(基于Hadoop2.4)——(一)
1 概述 该瞅瞅MapReduce的内部执行原理了,曾经仅仅知道个皮毛,再不搞搞,不然怎么死的都不晓得.下文会以2.4版本号中的WordCount这个经典样例作为分析的切入点.一步步来看里面究竟是个什 ...
- Hadoop InputFormat 输入文件分片
1. Mapper 与 Reducer 数量 对于一个默认的MapReduce Job 来说,map任务的数量等于输入文件被划分成的分块数,这个取决于输入文件的大小以及文件块的大小(如果此文件在 HD ...
- MapReduce源码刨析
MapReduce编程刨析: Map map函数是对一些独立元素组成的概念列表(如单词计数中每行数据形成的列表)的每一个元素进行指定的操作(如把每行数据拆分成不同单词,并把每个单词计数为1),用户可以 ...
- NoSQL生态系统——hash分片和范围分片两种分片
13.4 横向扩展带来性能提升 很多NoSQL系统都是基于键值模型的,因此其查询条件也基本上是基于键值的查询,基本不会有对整个数据进行查询的时候.由于基本上所有的查询操作都是基本键值形式的,因此分片通 ...
随机推荐
- ubuntu 下安装redis
获取Redis 1.通过官网http://redis.io/获取稳定版源码包下载地址: 2.通过wget http://download.redis.io/releases/redis-3.0.2.t ...
- cron - 定期执行指定命令的守护程序 (Vixie Cron)
总览 cron 描述 Cron 应该由 /etc/rc 或者 /etc/rc.local 启动(译注:有很多发行版与此不同的,如 RedHat6.x 使用 /etc/rc.d/init.d/crond ...
- CAD绘制固定圆形标注(网页版)
js中实现代码说明: function DoFixCircleComment() { var ent = mxOcx.DrawCustomEntity("TestMxCustomEntity ...
- oracle获取排序后的第一条信息
查询表table1里字段id小于10的所有数据,并且让数据根据id降序排列,然后得到第一条数据 select * from (select * from table1 where id<10 o ...
- linux下查找字符串的命令
1. set命令可以显示出当前shell下所有全局参量定义及其值; 2. 查找并删除当前目录下小文件: find . -type f -size -10k -exec rm {} \; 说明: w ...
- 诊断:ORA-16188: LOG_ARCHIVE_CONFIG settings inconsistent with previously started instance
11g数据库里面一个套RAC环境,之前搭建过DG,后来拆除掉.某次演练重启的时候,碰到数据库无法open的情况.日志显示 WARNING: The 'LOG_ARCHIVE_CONFIG' init. ...
- scrollfix.js插件:滚动固定在某个位置
插件文件在/文件 scrollfix.js 用法: var fix = $(".fix"), fixtop = $(".fix-top"), fixStartT ...
- JS如何禁用浏览器的退格键
<script type="text/javascript"> //处理键盘事件 禁止后退键(Backspace)密码或单行.多行文本框除外 function forb ...
- 零基础入门学习Python(22)--函数:递归是神马
知识点 递归是神马? 递归是属于算法的范畴. 递归就是函数调用自身的一种行为. >>> def g(): return g() >>> g() Traceback ...
- Python之字符串计算(计算器)
Python之字符串计算(计算器) import re expression = '-1-2*((60+2*(-3-40.0+42425/5)*(9-2*5/3+357/553/3*99/4*2998 ...