• 每日一文(第二天)


    特殊的组件partitioner与combiner

    1. partitioner定义
      partitioner的作用是将mapper(如果使用了combiner的话就是combiner)输出的key/value拆分为分片(shard),每个reducer对应一个分片。默认情况下,partitioner先计算key的散列值(通常为md5值)。然后通过reducer个数执行取模运算:key.hashCode%(reducer个数)。这种方式不仅能够随机地将整个key空间平均分发给每个reducer,同时也能确保不同mapper产生的相同key能被分发到同一个reducer。也可以自定义分区去继承partition把不同的结果写入不同的文件中 分区Partitioner主要作用在于以下两点

    (1)根据业务需要,产生多个输出文件;
    (2)多个reduce任务并发运行,提高整体job的运行效率
    适用范围:
    需要非常注意的是:必须提前知道有多少个分区。比如自定义Partitioner会返回5个不同int值,而reducer number设置了小于5,那就会报错。所以我们可以通过运行分析任务来确定分区数。

    1. map端的combine组件
      每一个 map 都可能会产生大量的本地输出,Combiner 的作用就是对 map 端的输出先做一次合并,以减少在 map 和 reduce 节点之间的数据传输量,以提高网络 IO 性能,是 MapReduce 的一种优化手段之一
      combiner 是 MR 程序中 Mapper 和 Reducer 之外的一种组件
      combiner 组件的父类就是 Reducer
      combiner 和 reducer 的区别在于运行的位置
      combiner 是在每一个 maptask 所在的节点运行
      reducer 是接收全局所有 Mapper 的输出结果;
      combiner 的意义就是对每一个 maptask 的输出进行局部汇总,以减小网络传输量

    具体实现步骤:

    1. 自定义一个 combiner 继承 Reducer,重写 reduce 方法
    2. 设置: job.setCombinerClass(CustomCombiner.class)
      combiner 能够应用的前提是不能影响最终的业务逻辑,而且,combine 输出 kv 应该跟 reducer 的输入 kv 类型要对应起来

    Combiner使用需要注意的是:
    1.有很多人认为这个combiner和map输出的数据合并是一个过程,其实不然,map输出的数据合并只会产生在有数据spill出的时候,即进行merge操作。

    2.与mapper与reducer不同的是,combiner没有默认的实现,需要显式的设置在conf中才有作用。

    3.并不是所有的job都适用combiner,只有操作满足结合律的才可设置combiner。combine操作类似于:opt(opt(1, 2, 3), opt(4, 5, 6))。如果opt为求和、求最大值的话,可以使用,但是如果是求中值的话,不适用。

    4.一般来说,combiner和reducer它们俩进行同样的操作。

    分布式计算的整个流程分析如下图所示:
    在这里插入图片描述

  • 相关阅读:
    5800交点正反算坐标(可计算不对称缓和曲线)
    GEE图表——趋势线图表的加载和展示包含纵坐标间隔的设定(以某区域年均降水总量为例)
    Gym 104025 M -Counting in Tree
    windows下搭建appium+android测试环境(node.js样例)
    揭秘传统数据库转型云原生的迅猛趋势
    HJ20 密码验证合格程序
    红米k40s和红米note11pro哪个值得买 两者配置对比
    三思近10000㎡天幕屏耀显上海“八万人”体育场
    C语言-动态内存分配
    MILP(混合整数线性规划)
  • 原文地址:https://blog.csdn.net/xiaomingaixuexi1/article/details/126296594