新旧版本FileInputFormat获得输入分片的不同
来源:互联网 发布:地理信息系统算法 编辑:程序博客网 时间:2024/09/21 08:44
有接触过hadoop的都应该清楚InputFormat 里有个getSplits方法,用来获得输入分片,并最终影响map task的数量。网上关于split的描述千奇百怪,各家说法都不一样,前几天一个老师跟我讲的FileInputFormat的 split的概念和我脑子里一直记得的split的概念不一样,着实让我困扰,甚至开始怀疑人生了。。。
今天把新旧版本的FileInputFormat的源码拿出来翻看了一下,才算明白了其中的道理,其实大家说的都没错,只是有些人说的是老的API的原理,有些人说的是新的API的原理。
(FileInputFormat老的在 org.apache.hadoop.mapred包下面,新的在org.apache.hadoop.mapreduce.lib.input包下面)。
老版定义:public InputSplit[] getSplits(JobConf job, int numSplits)
新版定义:public List<InputSplit> getSplits(JobContext job)
从定义上就有所区别了,老的有个numSplits参数,这个参数在JobClient中可以看到:
org.apache.hadoop.mapred.InputSplit[] splits =
job.getInputFormat().getSplits(job, job.getNumMapTasks());
是用job.getNumMapTasks()获得的,即mapred.map.tasks指定的值,默认是1: public int getNumMapTasks() { return getInt("mapred.map.tasks", 1); }
这个值在老版中是用来确定目标split大小的: long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
totalSize是输入的所有文件的总大小,即是一个我们期望的split分片大小。
我们再来看看最终splitSize的算法,
老版:long splitSize = computeSplitSize(goalSize, minSize, blockSize);=Math.max(minSize, Math.min(goalSize, blockSize));
新版:long splitSize = computeSplitSize(blockSize, minSize, maxSize);=Math.max(minSize, Math.min(maxSize, blockSize));
算法是相同的,只是传进去的参数就有非常大的差别了。
老版的第一个参数是goalSize即通过numSplits算出来的,所以调整mapred.map.tasks这个参数会对map数量会有影响,当然我们还可以调整minSize,由mapreduce.input.fileinputformat.split.minsize决定。mapred.map.tasks参数越大,goalSize就越小,当小于blockSize的时候,map的数量就会变多了。
新版的接口已经没有这个参数了,第一个参数变成了blockSize即块的大小了。调整splitSize主要通过调整minSize和maxSize来实现了。minSize由mapreduce.input.fileinputformat.split.minsize决定,maxSize 由mapreduce.input.fileinputformat.split.maxsize决定。当maxSize小于blockSize的时候,map的数量就变多了。
另外新老版本中都有这个逻辑:
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
String[] splitHosts = getSplitHosts(blkLocations,
length-bytesRemaining, splitSize, clusterMap);
splits.add(makeSplit(path, length-bytesRemaining, splitSize,
splitHosts));
bytesRemaining -= splitSize;
}
里面有一个SPLIT_SLOP=1.1,即允许有10%的溢出,由于是按照单个文件进行分片的,为了避免一个太小的分片存在,所以在最后一个分片中允许溢出10%,即最后一个分片的大小可能大于splitSize,但是一定<=1.1*splitSize。
0 0
- 新旧版本FileInputFormat获得输入分片的不同
- 新旧版本FileInputFormat获得输入分片的不同
- FileInputFormat类的输入路径
- cocos2d-x学习笔记-box2d实现物理引擎新旧版本的不同
- 源码分析Hadoop FileInputFormat如何分片
- 新旧版本的DI-624+A
- 解决flex新旧版本的兼容性写法
- 不同版本Hidernate获得SessionFactory对象的方法
- 不同版本Hidernate获得SessionFactory对象的方法
- 两选一的SQL(系统新旧名获得)
- 新旧版本spring
- MapReduce对输入多文件的处理2自定义FileInputFormat类
- ffmpeg 新旧版本AVFrame中data的yuv颠倒
- Hadoop学习笔记二(新旧版本API的区别)
- 关于ADT新旧版本替换和更新的问题
- 新旧MFC版本CEdit透明的2种实现方法
- poi读写Excel文件,兼容新旧版本的简单例子
- easyui filebox限制文件上传的类型accept (新旧版本)
- 百度地图sdk学习心得
- 响应式网站制作
- First-class function 头等函数
- 第三章SignalR在线聊天例子
- Poj 3734 Blocks(DP,矩阵乘法优化)
- 新旧版本FileInputFormat获得输入分片的不同
- Leetcode: Valid Parentheses
- Android从Existing Code新建工程的兼容支持问题
- 一次谷歌面试趣事
- 转:Jsp和Servlet里面的response、request、编码、路径问题
- LeetCode 028 Implement strStr()
- Ubuntu上搭建本地Git服务器
- tyvj P1038 忠诚 ST表(RMQ)
- JAVA集锦(一)--IO流梳理