mapreduce执行流程和优化
执行流程:
1,程序在调用submit()方法之前,会生成一份任务分配规划。
2,提交数据到RM,包含一份job.split 文件和job.xml文件和jar包。
3,RM根据提交的资源文件,分配任务,启动相应的mapTask任务。
4,mapTask任务根据程序设置的文件读取类去读文件数据,比如TextFileInputFormat,底层是调用RecorderReader组件的reader()方法去读取数据。
5,数据读取进入map方法,执行我们的业务逻辑,最后写出。
6,数据写出时,先经过分区方法,标记好数据所属的分区,在进入环形缓冲区。
7,当环形缓冲区的数据量大小达到阈值(默认80%)时,数据溢写到磁盘文件。
8,在溢写之前,会根据按照字典顺序对key进行快速排序,。
9,当分区溢写到磁盘的文件数量达到默认的10个时,会进行merge操作,把10个文件合并为1个。在合并的过程中会做归并排序。
10,如果配置了combiner,则在归并之前执行combiner合并。
11,当所有的mapTask任务执行完成,则启动相应的reduceTask任务。
12,reduceTask任务从mapTask中拉去对应的分区数据。
13,reduceTask拉去的分区数据,先进入内存中存储,当内存不足时,溢写到磁盘文件。
14,当该reduceTask拉取完数据后,会进行合并文件,归并排序,分组。
15,数据进入reduce方法,执行业务逻辑。
16,最后数据通过RecorderWirter的wirte方法写出到文件系统等。
优化:
mr程序主要是基于磁盘的,效率比较低,当我们需要执行mr程序时,有很多需要调优的地方。
1,从mr处理的数据上来观察,如果处理的数据存在大量小文件,可能会启动大量的mapTask任务,这样会频繁的抢占集群资源。可以使用ConbineFileInputFormat来读取数据。
2,map端:增大环形缓冲区大小,由原来的默认100M调大到200M;增大溢写的阈值,由默认的80%调大到90%;增大合并的文件个数,由默认的10个执行合并,增大为20个;如果在不影响最终结果的情况下,设置conbiner,减少数据量,减少io。
3,reduce端:增大reduce端内存大小,减少溢写磁盘次数;合理设置reduce个数;设置map和reduce共存;增大reduce拉去数据的并行数;如果可以的情况,规避使用reduce端。
4,宏观上:调大map和reduce任务的内存,默认1G调大到4G;增大map和reduce任务的cup数;增加每个container的内存和cpu大小;调整mapTask和reduceTask的最大重试次数。
5,压缩:在map端输出数据时,可以使用压缩,减少磁盘io,这个地方需要速度快的压缩方式,不需要分片,可以采用snappy压缩;对应链式的mr程序,那么在reduce端输出数据时,可以考虑使用bizp2和lzo压缩。

浙公网安备 33010602011771号