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压缩。

 

posted @ 2020-06-16 10:18  大数据码农  阅读(307)  评论(0)    收藏  举报