1. InputFormat
InputFormat是MapReduce框架提供的用来处理job输入的基类
它主要定义了三个功能:
1.验证job输入是否合法
2.对输入文件进行逻辑切片(InputSplit),然后将每个切片分发给单独的MapTask
3.提供切片读取器(RecordReader),用来读取切片中的数据
InputFormat作为抽象父类,只是定义了核心方法,根据具体的数据源类型和切片规则 MapReduce框架提供了很多功能子类
核心子类:
DBInputFormat:将数据库中的数据作为MR程序的输入数据
FileInputFormat:将hdfs或本地文件作为MR程序的输入数据
源码阅读:
package org.apache.hadoop.mapred;
// InputFormat对象
public abstract class InputFormat<K, V> {
TODO:
1.将Mr程序输入的文件进行逻辑切分,并返回切片对象集合
注意:
1.这里的分割是逻辑分割,不是物理分割哦!!!
public abstract
List<InputSplit> getSplits(JobContext context
) throws IOException, InterruptedException;
TODO:
1.为指定的切片对象,创建记录阅读器
public abstract
RecordReader<K,V> createRecordReader(InputSplit split,
TaskAttemptContext context
) throws IOException,
InterruptedException;
}
// 切片对象
public class FileSplit extends InputSplit implements Writable {
// 该切片 所属文件的路径
private Path file;
// 切片起始位置(文件偏移量)
private long start;
// 切片长度
private long length;
// 存储切片的hosts
private String[] hosts;
private SplitLocationInfo[] hostInfos;
}
2. FileInputFormat
FileInputFormat是当MR程序为hdfs或本地文件时,处理数据源的基类
它实现了很多具体方法,比如切片方法(getSplits)和isSplitable判断文件是否可切片
2.1 getSplits-切片规则
1.对job输入路径中的每个文件单独切片
2.判断每个文件是否支持切片
true : 按照指定切片大小对文件切片
false: 文件整体作为一个切片
2.2 怎样设置切片大小
// 切片大小计算规则
splitSize = Math.max(minSize, Math.min(maxSize, blockSize))
// 切片大小设置参数
set mapreduce.input.fileinputformat.split.minsize=256000000 或
set mapred.min.split.size=256000000
set mapreduce.input.fileinputformat.split.maxsize=256000000 或
set mapred.min.split.size=256000000
//场景1: 没有设置minsize、maxsize参数
maxSize=Long.MAX_VALUE
minSize=1L
blockSize=本地目录32M|HDFS目录128M或256M(看hdfs文件块具体配置)
splitSize=blockSize(32M|128M|256M)
//场景2: 设置minsize、maxsize参数
maxSize=mapreduce.input.fileinputformat.split.maxSize
minSize=mapreduce.input.fileinputformat.split.minsize
blockSize=本地目录32M|HDFS目录128M或256M(看hdfs文件块具体配置)
需求1: splitSize > blockSize
set mapreduce.input.fileinputformat.split.minSize=大于blockSize值
需求2: splitSize < blockSize
set mapreduce.input.fileinputformat.split.maxSize=小于blockSize值
2.3 源码阅读
可以看之前写的例子 🌰
3. CombineFileInputFormat
转载1: https://blog.csdn.net/hummingbird0/article/details/115084843
转载2: https://blog.csdn.net/qq_35241080/article/details/106065442