InputFormat抽象类源码分析

InputFormat抽象类源码解析
--------------------------
0.做两件事:【进行逻辑切分InputSplit;创建RecordReader】
1.抽象方法:List<InputSplit> getSplits(JobContext context)
说明:逻辑地分割作业的输入文件集-->InputSplit。然后将每个InputSplit分配给一个单独的Map进行处理
2.抽象方法:RecordReader<K,V> createRecordReader(InputSplit split,TaskAttemptContext context)
说明:为给定的切分创建一个记录读取器。框架将调用RecordReader#initialize(InputSplit, tasktrytcontext)}使用分割。
3.默认加载的类为FileInputFormat(抽象类)
FileInputFormat
------------------------------------------
说明:基于文件的输入格式的基类。FileInputFormat是所有基于文件的inputformat的基类。
FileInputFormat的子类还可以覆盖isSplitable(JobContext, Path)方法,以确保输入文件不被分割,并由map作为一个整体进行处理。
1.计算split:
getSplit()-->【获取最小值:1】minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
-->【获取最大值:Long.MAX_VALUE】maxSize = getMaxSplitSize(job);
-->【获取文件信息和blockLocation】...
-->【获取文件的block大小】blockSize = file.getBlockSize();
-->【计算splitsize切分大小】splitSize = computeSplitSize(blockSize, minSize, maxSize);
-->Math.max(minSize, Math.min(maxSize, blockSize));
说明:a.先将块大小与默认最大值大小做比较,取小值;结果为128m
b.将上一步的计算结果与输入文件的最小值比较,取大值,结果为128m;
总结:默认情况小,split切分大小与block大小相同;
-->【计算生成InputSplit(FileSplit),并添加至List中】

2.相关属性:
【mapred-site.xml】:mapreduce.input.fileinputformat.split.minsize = 0
说明:默认设置文件输入切分最小值为0
【FileInputFormat.class】:mapreduce.input.fileinputformat.split.maxsize = Long.MAX_VALUE
说明:默认设置文件输入切分最大值为long最大值
【FileInputFormat.class】:mapreduce.input.fileinputformat.input.dir.recursive = false
说明:默认情况下不允许输入路径递归;可以调用FileInputFormat.setInputDirRecursive(job, true)
【mapred-site.xml】:mapreduce.input.fileinputformat.list-status.num-threads = 1
用于列出和获取块位置的线程数。对于指定的输入路径
3.默认将“_”和“.”开头的文件过滤掉;


split切分规则,计算splitsize
----------------------------------------------------------
最小值 最大值 块大小 切分大小
minSize maxSize blocksize splitsize
1. 1 Long.MAX_VALUE 128m 128m
【默认情形】
2. 1 Long.MAX_VALUE 256m 256m
【修改块大小】
3. 1 64m 128m 64m
【修改mapreduce.input.fileinputformat.split.maxsize大小】
4. 130m Long.MAX_VALUE 128m 130m
【修改mapreduce.input.fileinputformat.split.minsize大小】


Recordreader源码分析
-----------------------------------------
TextInputFormat做说明:
---------------------------------------
1.用于纯文本文件的InputFormat子类。文件被分解成行;换行或回车都用来表示每行的结尾。键是文件中的偏移量和值是行的文本。
2.isSplitable()-->判定是否可被切分:纯文本或bzip2压缩格式可切分,其余方式均不可以。
3.createRecordReader(InputSplit split,TaskAttemptContext context)
-->new LineRecordReader(recordDelimiterBytes)
【LineRecordReader.class】:将键视为文件中的偏移量,将值视为行
-->属性:mapreduce.input.linerecordreader.line.maxlength = Integer.MAX_VALUE
-->initialize()
-->SplitLineReader in 【构建org.apache.hadoop.util.LineReader】
org.apache.hadoop.util.LineReader.class
-->默认按“ ”," "," "进行处理


 

 

 

原文地址:https://www.cnblogs.com/lyr999736/p/9250963.html