(六)MapReduce理论

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qinshi965273101/article/details/83348655

MR框架运行,会生成两类任务:①Map Task ②Reduce Task

  • Map Task的数量取决文件大小

切片大小默认为128MB,比如一个257MB的文件,会生成3个切片(Split),即会对应3个Map Task。

开发Mapper组件就是在定义Map Task的业务逻辑。一个Job的多个Map Task 业务逻辑一致,只是处理的数据不同。

  • Reduce Task任务数量可以在job中设置,默认是1个
//设置reduce task的数量,如果不设定,默认是一个
job.setNumReduceTasks(3);

Map Task计算得到的数据如何传递给Reduce Task

  • 分区:我们习惯把 Reduce Task叫做分区
  • 默认分区算法:获取key的hashcode,对reduce task的数量取余,来对应每个reduce分区,确保一样的key聚合到同一个分区。对应java类:HashPartitioner
  • combiner:实现在Mapper端进行key归并。如果不用combiner,那么所有的结果都是reduce完成,效率会很低。使用combiner先做合并,然后发往reduce。combiner具有类似本地的reduce的功能。

默认是没有Combiner的,需要在job中设置

//设置对应的Combiner类
job.setCombinerClass(CombinerDemo.class);

MR理论核心

  • 每个Map Task在内存中都有一个溢写缓冲区,默认大小100m,溢写阈值 0.8(可配置)。当缓冲区数据达到溢写阈值,会发生Spill溢写过程,把内存中数据溢写到磁盘的文件上,形成Spill溢写文件。可能有多个溢写文件,最后会通过Merge操作,把多个Spill文件合并成一个最终结果文件,然后删除所有的Spill文件。每个Map Task 都会有一个最后结果文件。
  • Map Task的输出k v,一开始会进入溢写缓冲区中,对数据做处理,比如分区、排序等操作。Spill文件的数据也都已经分好区,排好序。最终结果文件也是如此。
  • Spill和Merge过程不一定会发生。如果发生了Spill过程,最后存留在溢写缓冲区里数据,会Flush到最后生成的文件中。若只有一个Spill文件,则不会发生Merge过程。
  • 加入了Combiner中间过程,在溢写缓冲区的处理阶段会触发该过程,对溢写的数据做处理,减少数据在溢写缓冲区的存储,间接减少了Spill次数,即减少了磁盘的I/O次数。但是在Merge过程中,当Spill文件大于等于3个时才会发生该过程。
  • Map Task的输出结果有两类收集器:①DirectMapOutputCollector 在没有reducer组件的情况下使用 ②MapOutputBuffer 在有reducer组件的情况下收集,在这个类中,包含了Spill 、溢写缓冲区相关的对象。

注意点

  • 最终结果文件保存在服务节点的本地磁盘上。可以开启Map Task的压缩机制,将该文件压缩,减少网络数据的传输。
  • 虽然一个Map Task处理的切片数据默认最多是128MB,但是不能凭文件的大小来判断Map Task的输出大小,要根据实际的业务代码来判断。

猜你喜欢

转载自blog.csdn.net/qinshi965273101/article/details/83348655