经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » MapReduce » 查看文章
【概念】详解MapReduce原理
来源:cnblogs  作者:冷幽篁  时间:2021/1/25 10:46:01  对本文有异议

MapReduce原理

原理图1
原理图2

Map阶段

  • 文件在被读取(调用read())的是用Inputformat方法读入的。在这里读入一行,返回一个key-vlaue(K,V)对,key是行号的偏移量,value的值是这一行的内容。
  • 在上述过程中,在第4步调用map()方法后,将以上内容真正转换成(key,value)的形式,key为值,value为1,然后调用context.write方法将该数据写出来
  • 经过outputcollector收集器之后会写入环形缓冲区。在环形缓冲区会做如下几件事
    1. 排序,调用的是快速排序法
    2. 分区,调用的 hashpartitioner分区。达到80%之后会溢出将文件写到磁盘。相同的hash值会分到一个分区中,可以认为设定分区数。排序的时候是依据partition和key两个来作为依据的。同一个partition中是按照key进行排序的
  • 第7步:环形缓冲区spill溢写到磁盘中,会溢出多次到不同的分区中,之后会进行merge,并进行归并排序。将多个小文件合并成大文件,所以合并之后的大文件还是分区,并且分区内部是有序的
  • Combiner阶段是可选项,形式上也是一种reduce操作。在这个过程中可以直接让相同key的value进行聚合(相加等),减少数据量以及在网络中传输的开销,能大大提高效率

Reduce阶段

  • Reduce阶段会去map阶段merge之后的文件中拿数据,按照相同的分区去取数据。reduce中有分区号,将数据拿过来之后会存储在本地磁盘。此过程会进行I/O读写,并有相应的网络传输
  • 拿到数据后,会按照相同的分区,再将取过来的数据进行merge归并排序,大文件的内容按照key有序进行排序
  • 之后会调用 groupingcomparator 进行分组,之后的reduce中会按照这个分组,每次取出一组数据,调用reduce中自定义方法进行处理
  • 最后调用outputformat将内容写入到文件中

Shuffle阶段

  • 核心机制:数据分区,排序,缓存,分发

原理图3

针对MR原理进行HIVE优化

  1. 优化总体思路就是减少数据倾斜,降低I/O,降低网络传输量
    1. 数据倾斜:是指在shuffle的过程中,把大量相同的key分到了一个Reduce节点上进行处理,其他的key分到其他Reduce节点上,导致Reduct Task处理完后,还有一个Reduct Task节点还在处理数据。最终导致整个Reduce的延迟情况
  2. 采用分而治之的方式,在Sql层面,通过改写Sql进行优化

环形缓冲区默认100M,mr.sort.mb=100M

参考链接:

原文链接:http://www.cnblogs.com/yaowentao/p/14309766.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号