MapReduce的组成架构及工作原理

MapReduce组成架构

一个完整的MapReduce程序在分布式运行时有三类实例进程:
1.MrAppMaster:负责整个程序的过程调度及状态协调。
2.MapTask:负责Map阶段的整个数据处理流程,并发执行,数目由数据的分片数决定,map()按行处理,对每个键值对调用一次。
3.ReduceTask:负责Reduce阶段的整个数据处理流程,并发执行,数目由数据的分区数决定。reduce()对每一组相同键的键值对调用一次。

MapReduce工作原理

客户端job提交切片信息、配置文件信息、驱动jar包到yarn集群上的ResourceManager,ResourceManager开启MRAppMaster,MRAppMaster开启与切片数目相同个MapTask进程。MapTask到hdfs对应目录下读取数据切片,每个键值对进入一次map()方法后输出到环形缓冲区中,环形缓冲区一半存储数据的元数据(索引、分区号、键偏移量、值偏移量),一半存储数据,数据在环形缓冲区中根据分区号进行分区,区内进行排序。当环形缓冲区被占用80%开始溢写到磁盘文件(文件中数据分区且区内有序),很有可能进行多次溢写。在磁盘文件中可以进行合并(合并为可选流程),全部数据溢写完后进行归并排序(归并:将多个有序的小文件合并成一个有序的大文件),可再次进行合并,可将文件进行压缩减少网络io量,MapTask流程结束。ReduceTask到各个MapTask所在节点拷贝文件到内存缓冲,内存不够溢写到磁盘,拷贝完成后对所有数据进行归并排序,再对相同key进行分组,一组相同key的键值对进入reduce()方法,处理后写入文件。

切片机制

客户端负责文件切分。
如果文件小于块大小,一个文件为一个切片。
如果文件大于块大小并大于块大小的1.1倍,以块大小为单位进行切片。
如果文件大于blocksize但不大于blocksize的1.1倍,一个文件为一个切片。
切片数决定MapTask数。

分区

默认根据key的哈希值分区。
自定义分区:创建自定义分区类,由job进行关联,再设置与分区数目一致的ReduceTask数。
分区数应与ReduceTask的数目一致。
如果分区数大于ReduceTask数但ReduceTask的数目为1,程序正常执行,只是会产生一个输出文件。
如果分区数大于ReduceTask数而且ReduceTask的数目不为1,抛非法分区数异常。
如果分区数小于ReduceTask数,程序正常执行,只是会产生(ReduceTask数-分区数)个空文件。

合并

Combiner是MR程序中Mapper和Reducer之外的一种组件,其父类是Reducer。
Combiner和Reducer的区别在于运行的位置:
Combiner在每一个Maptask所在节点运行。
Reducer是接收全局所有Mapper的输出结果。
Combiner的意义就是对每一个Maptask的输出进行局部汇总,以减小网络传输量。
Combiner能够应用的前提是不能影响最终的业务逻辑,而且Combiner的输出kv类型应该与Reducer的输入kv类型一致。
合并是优化的方式之一,适合处理汇总操作,不能处理求平均值的操作,因为会影响最终的业务逻辑。
自定义类,由job进行关联。

你可能感兴趣的:(MapReduce)