• 每日一文(第二天)


    特殊的组件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它们俩进行同样的操作。

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

  • 相关阅读:
    Python语言学习实战-内置函数property()的使用(附源码和实现效果)
    Verilog写状态机的三种描述方式之二段式
    Maven环境配置
    vscode-server
    Qt QStringLiteral
    Burstormer论文阅读笔记
    [工业互联-4]:工业有线互联总线之IO-Link
    JAVA高级教程-Java List(2)
    python面向对象(下)
    汇编原理计算方法:物理地址=段地址*16+偏移地址
  • 原文地址:https://blog.csdn.net/xiaomingaixuexi1/article/details/126296594