FileInputFormat分析
来源:互联网 发布:mac 照片 编辑:程序博客网 时间:2024/05/27 06:55
一. 程序简介
在mapreduce程序运行的开始阶段,hadoop需要将待处理的文件进行切分,按定义格式读取等操作,这些操作都在InputFormat中进行。
InputFormat是一个抽象类,他含有getSplits()和createRecordReader()抽象方法,在子类中必须被实现。这两个就是InputFormat的基本方法。getSplits()确定输入对象的切分原则,而createRecordReader()则可以按一定格式读取相应数据。
二.程序详细分析
FileInputFormat中实现的getSplits()方法如下:
public List<InputSplit> getSplits(JobContext job ) throws IOException { long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job)); long maxSize = getMaxSplitSize(job); // generate splits List<InputSplit> splits = new ArrayList<InputSplit>(); for (FileStatus file: listStatus(job)) { Path path = file.getPath(); FileSystem fs = path.getFileSystem(job.getConfiguration()); long length = file.getLen(); BlockLocation[] blkLocations = fs.getFileBlockLocations(file, 0, length); if ((length != 0) && isSplitable(job, path)) { long blockSize = file.getBlockSize(); long splitSize = computeSplitSize(blockSize, minSize, maxSize); long bytesRemaining = length; while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) { int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining); splits.add(new FileSplit(path, length-bytesRemaining, splitSize, blkLocations[blkIndex].getHosts())); bytesRemaining -= splitSize; } if (bytesRemaining != 0) { splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining, blkLocations[blkLocations.length-1].getHosts())); } } else if (length != 0) { splits.add(new FileSplit(path, 0, length, blkLocations[0].getHosts())); } else { //Create empty hosts array for zero length files splits.add(new FileSplit(path, 0, length, new String[0])); } } LOG.debug("Total # of splits: " + splits.size()); return splits; }根据对代码的分析,可以看到它是对一个目标文件进行切分操作。如何拆分文件依据以下几个参数:maxsize,BlockSize,minsize
long minSize = Math.max(getFormatMinSplitSize(),getMinSplitSize(job));long maxSize = getMaxSplitSize(job);long blockSize = file.getBlockSize(); 根据这3个参数来确定切分文件块的size大小long splitSize = computeSplitSize(blockSize, minSize, maxSize); minSize: mapred.min.split.size maxSize : mapred.max.split.size简单来讲就是切分的原则是splitSize不会小于minSize,不会大于maxSize,如果blockSize能够满足以上要求就取blockSize,如果不能的话就在maxSize和minSize中取值。
确定了文件的切分块大小后就能进行切分操作,如下图:
这里的RecordReader就是对拆分后的文件如何读取进行了封装,例如以回车符分隔行,按逗号分隔列的典型文件就在RecordReader中定义。
当文件被split以后,会和ReacordReader一起被传递到Mapper类中,Mapper就根据这两个参数将文件转化成可被MapReduce读取的源数据结构。之后再完成map和reduce的操作。
- FileInputFormat分析
- FileInputFormat分析
- 源码分析Hadoop FileInputFormat如何分片
- MR-2.输入格式(InputFormat)FileInputFormat源码分析
- Hadoop2.6.0的FileInputFormat的任务切分原理分析(即如何控制FileInputFormat的map任务数量)
- FileInputFormat详解
- hadoop FileInputFormat.addInputPaths兼容FileInputFormat.setInputPath
- Hadoop SequenceFile FileInputFormat实现
- FileInputFormat和CombineFileInputFormat
- FileInputFormat原理与用法
- hadooop 之 FileInputFormat 类
- MapReduce InputFormat之FileInputFormat
- Mapreduce程序中的FileInputFormat.addInputPaths和FileInputFormat.addInputPath方法
- Mapreduce程序中的FileInputFormat.addInputPaths和FileInputFormat.addInputPath方法
- mapreduce的文件拆分,FileInputFormat
- FileInputFormat类的输入路径
- Hadoop中FileInputFormat源码解析
- mapreduce的文件拆分,FileInputFormat
- 我们应该如何消气
- Android:Debug certificate expired on DATE 解决方法
- MYSQL常用命令
- 深入浅出Win32多线程程序设计之基本概念
- C# 使用JSON对数据序列化和反序列化.
- FileInputFormat分析
- ID3V1 ID3V2 以及 APEV的规格
- 多进程编程
- Java程序员必读的十本书编程技巧
- 50个必备的实用jQuery代码段
- eclipse下调试 java
- Ubuntu下获得root权限和设置静态IP(VM5.0/7.0)
- Android Audio: Problems, Hidden Limitations and OpenSL ES
- 精灵三秒消失 cocos2d