1.mapreduce的简介
mapreduce:基于YARN的系统,用于并行处理大型数据集,在我看来是一个计算框架,
官网对于mapreduce的解释:Hadoop MapReduce是一个软件框架,用于轻松编写应用程序,以可靠,容错的方式在大型集群(数千个节点)的商用硬件上并行处理大量数据(多TB数据集)。
MapReduce 作业通常将输入数据集拆分为独立的块,这些块由map任务以完全并行的方式处理。框架对地图的输出进行排序,然后输入到reduce任务。通常,作业的输入和输出都存储在文件系统中。该框架负责调度任务,监视它们并重新执行失败的任务。
2.mapreduce的数据流转形式(分为map阶段和reduce阶段)
(input) <k1, v1> -> map阶段 -> <k2, v2> -> reduce -> <k3, v3> (output)
文字解释:我们指定处理的文件输入map时以<k,v>的形式进入map
此时的数据<k,v>对成为<k1,v1>,k1表示行偏移量,v1表示该行的内容
那么我们的数据是如何转换成<k1,v1>的形式传入map阶段的呢??这就是我们今天要说的预处理阶段
作为MapReduce过程的预处理阶段,InputFormat起到怎么的作用呢??
InputFomat接口的JAVAAPI解释:逻辑上分割作业的输入文件集。且每个切分后的inputsplit对应一个mapper,简单的说,决定我们mapper的个数,InputFomat中文直译:输入规范/输入格式,规范了我们的输入文件
* 在InputFormat接口中只有两个方法
* 1. InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
* 2. RecordReader<K, V> getRecordReader(InputSplit split,
JobConf job,
Reporter reporter) throws IOException;
* 其中getSplit方法,可以决定文件是否切分。【是一整个文件进行整理(如奇偶行求和,如果文件被切分了,
* 可能造成奇偶和的错乱,所以不能切分),或是文件太大,切分成若干split,提高处理速度】
* 而getrecordReader方法,可以返回一个任意的recordReader
既然inputformat是一个接口,我们可以选择了解一下它的实现类,我们经常使用的FileInputFormat
FileInputFomat:抽象类,实现了InputFormat接口
JAVAAPI解释:一个基于文件的InputFormat基础类,并且提供了getSplit()的通用实现,它的子类也可以覆盖这个方法,从而达到是文件作为一个整体而不被切分。
【InputFormat抽象方法解析一:getSplit()】
那么我们的文件是如何切分的呢??
方法一:判断文件是否可切分:isSplitable()
在FileInputFormat类中,通过isSplitale方法,可以设置文件是否可切分,在此类中,恒返回ture,表示文件可被切分
protected boolean isSplitable(JobContext context, Path filename) {
return true;
}
方法二:判断文件如何切分/计算切分大小:getSplits()
public List<InputSplit> getSplits(JobContext job) throws IOException {
StopWatch sw = new StopWatch().start();
long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));