mapreduce工作机制
工作机制
1.mapreduce框架,客户端会启动MRappMaster程序,MRAppMaster会启动yarn child(map task)产生数据之后,会启动yarn child(reduce task)进行处理。
2.划分输入切片
Job客户端负责划分:扫描输入目录中的所有文件,遍历每一个文件:按照128M规则划分范围,生成如下格式:
FileSplit0:/wordcout/input/a.txt 0-128m
FileSplit1:/wordcout/input/a.txt 128-256m
FileSplit2:/wordcout/input/a.txt 256-384m
根据生成的这些文件格式,生成对应的map task实例,来读取文件,具体是TextInputFormat类来读的,每次读一行,LineRecordReader.next(),生成一次key-value,key是行起始偏移量,value是行内容。在WcMapper.map(k,v,context)正好是上面产生的内容,然后context.write(k,v).MapOutputCollector放到缓存中储存起来,存储的结构是环形缓冲区,当存储的容量占据80%之后,启动Spiller线程进行分区和排序,分区是按照partitioner的getPartition(),排序是根据key的compareTo(),分区排序好的数据会存放到机器的本地磁盘上。最后会调用Merge进行合并。
至此map task工作完成
3.reduce task开始工作
WcReduce类的reduce(k,迭代器,context)方法中进行聚合,context.write(k,v)写到文件中。TextOutputFormat.getRecordWriter()进行文件写入LineRecordWriter.write(k,v)
maptask生成的数据传给reducetask的过程叫shuffle
输入输出格式
默认是文本格式的TextOutputFormat
可以设置为SequenceFileOutputFormat,是将对象直接序列化,进行存储,读取的时候也得相对应地读取序列化的对象。