MR解析详解,.
1. map阶段
1.1 对输入文件的每一行,解析成<key、value>。每一个键值对调用一次map函数
1.1.1. 输入文件进行InpuSplit,再把InpuSplit分给对应的mapper.InputSplit包含处理的文件信息
FileInputFormat类中
public List<InputSplit> getSplits(JobContext job)
--取给的文件的最小切片和JOB文件的最小切片 long minSize = Math.max(this.getFormatMinSplitSize(), getMinSplitSize(job)); --取文件的最大切片 long maxSize = getMaxSplitSize(job);
--进行文件大小的切割
1.1.2 提供,.一个RecordReader的实现类,把InputSplit的内容一行一行地拆分成<k1,v1>
1.2.3 就把<k1,v1> 按照指定的业务规则进行切割划分,每行数据调用一次mapper
String[] fields = line.split(" "); //遍历获取每个单词 for (String field : fields){ //输出,每个单词拼接 1(标记) (java(K) 1(V)) context.write(new Text(field),new IntWritable(1)); }
注意:
1.1倍:最常见的问题就是:一个大小为130M的文件,在分片大小为128M的集群上会分成几片?答案是1片;因