• 整个shuffle的流程图


    整个shuffle的流程图

     
    Paste_Image.png

    Map Shuffle的作用以及相应的设置

    1. partition

      • 过程:输入的<key,value>对经过map()处理后输出新的<key,value>对,它首先会被存储到环形缓冲区中(字节数组实现)。该环形缓冲区的大小默认为100MB。并且会对每个<key,value>对hash一个partition值,相同partition值为同一个分区。
      • 作用:由于map()处理后的数据量可能会非常大,所以如果由一个reduce()处理效率不高,为了解决这个问题可以用分布式的思想,一个reduce()解决不了,就用多个reduce节点。一般来说有几类分区就对应有几个reduce节点,把相同分区交给一个reduce节点处理。
      • 设置
        • 环形缓冲区大小:mapred-site.xml中设置mapreduce.task.io.sort.mb的值
        • 环形缓冲区溢写的阈值:mapred-site.xml中设置mapreduce.map.sort.spill.percent的值
        • partition:job.setPartitionerClass(cls)


           
          Paste_Image.png
    2. sort

      • 过程:把环形缓冲区中的数据根据partition值和key值两个关键字升序排序。同一partition内的按照key排序。
      • 作用:一般来讲mapreduce框架用来做各种排序操作,先在map端排序,减少reduce端排序的负担。
      • 设置:job.setSortComparatorClass(cls)
         
        Paste_Image.png
    • combiner
      • 过程:将sort后的数据进行combiner操作
      • 作用:可以理解为map端的预reduce操作,在数据量非常大的时候,这样的优化可以节省很多网络带宽和本地磁盘IO流的读写。
      • 设置:job.setCombinerClass(cls)
         
        Paste_Image.png
    1. compress

      • 过程:压缩combiner输出后的数据
      • 作用:减少本地磁盘的读写和减少reduce拷贝map端数据时的网络带宽
      • 设置
        1. Configuration对象用来解析XML文件,可以用set方法来设置属性值。


           
          Paste_Image.png
        2. 寻找要设置的相关属性


           
          compress.png
        3. 内置的三种压缩算法


           
          compresssuanfa.png
        4. 配置key,value


           
          peizhi.png
    2. spill

      • 过程:将排序后的内存数据spill到本地磁盘中
      • 作用:因为数据量非常大,全部存放在内存中不太现实,所以最后还是会存到本地磁盘中
    3. merge

      • 过程:因为可能会有几次spill,本身存放数据的out文件和存放数据偏移量索引index文件都会产生多个,把多个这样的文件合并。
      • 作用:方便reduce的一次性拷贝。
      • 设置:
         
        mapsort.png

    Reduce Shuffle的作用以及相应的设置

    1. merge

      • 过程:reduce拷贝map()最终输出的磁盘数据,一个reduce应该拷贝每个map节点的相同partition的数据。
      • 作用:因为有多个map节点,拷贝后的数据文件不止一份,先进性合并操作,为后面的排序做准备。
    2. sort

      • 过程、作用:这里和map端的一样。
    3. group

      • 过程:将排序好的<key,value>对进行分组,分组规则默认的是将相同key的value放在一起。
         
        fenzu.png
      • 作用:为了reduce()更好的计算相同key值出现的次数。
      • 设置:job.setGroupingComparatorClass(cls);
         
        比较2.png

    shuffle阶段中Comparator的理解和作用

    1. 被用来作为排序比较和分组比较的依据
    2. 排序比较和分组比较都是通过实现下图中的接口方法


       
      sort.png

       
      比较2.png
      • 其中b1为第一个字节数组,s1为开始的index,l1为b1比较的长度,b2为第二个字节数组,s2为开始的index,l2为b2比较的长度


         
        比较3.png
      • 底层用到了java.util.Comparator.compare(T o1, T o2)函数


         
        比较4.png

    MapReduce执行过程中中间数据的压缩配置和其余的配置

    1. 压缩配置见map过程
    2. 设置reduce的数目
      job.setNumReduceTasks(tasks);其中tasks为int型整数。合理的设置reduce数目是一种性能调优,实际生产环境中最好用测试的方式来抉择较好的reduce数目


    作者:心_的方向
    链接:https://www.jianshu.com/p/fc36464f4c6d
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    专职DBA-MySQL体系结构与基本管理
    JSON
    MIME类型
    文件上传下载
    response常用的方法
    2020.11.27小记
    HTTP请求状态码
    1561. Maximum Number of Coins You Can Get
    1558. Minimum Numbers of Function Calls to Make Target Array
    1557. Minimum Number of Vertices to Reach All Nodes
  • 原文地址:https://www.cnblogs.com/cenglinjinran/p/9023484.html
Copyright © 2020-2023  润新知