玩转大数据大数据

MapReduce编程模型

2019-10-15  本文已影响0人  HideOnStream

本篇文章介绍一下MapReduce[1]分布式计算

先回顾一下Hadoop架构:
Hadoop由HDFS分布式存储、MR分布式计算、Yarn资源调度三部分组成

Hadoop
MR
MR分治
Map阶段
Reduce阶段

Map&Reduce工作流程图如下:

Map和Reduce工作流程

下面以MR的词频统计为例,详细介绍MR工作流程。
需求:统计一批英文文章中,每个单词出现的总次数。
假设:现在有一个输入文件"Gone With The Wind",这个文件有三个block:block1, block2, block3。三个block的内容依次如下图。

MR原理图
MR中key的作用

MR编程中,key有特殊的作用:
数据中,若要针对某个值进行分组、聚合时,需将此值作为MR中的reduce的输入的key。 如上边词频统计例子,按单词进行分组,每组中对出现次数做聚合(计算总和);所以需要将每个单词作为reduce输入的key,MapReduce框架自动按照单词分组,进而求出每组即每个单词的总次数。

聚合

另外,key还具有可排序的特性,因为MR中的key类需要实现WritableComparable接口;而此接口又继承Comparable接口(可查看源码)。

排序

MR编程时,要充分利用以上两点;结合实际业务需求,设置合适的key。

Shuffle

前面在讲map和reduce的工作原理的时候,对于map的处理结果只是简单地说保存在磁盘,而对于reduce,也只是简单地说了从map端获取处理结果作为其输入。这两个过程其实并不是那么那么简单,当中还有一个shuffle的过程。

Shuffle简图 Shuffle细节图

其中,分区用到了分区器,默认分区器是HashPartitioner,源码:

public class HashPartitioner<K2, V2> implements Partitioner<K2, V2> {

  public void configure(JobConf job) {}

  /** Use {@link Object#hashCode()} to partition. */
  public int getPartition(K2 key, V2 value,
                          int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }

}
  • 在合并溢写文件时,如果至少有3个溢写文件,并且设置了map端combine的话,会在合并的过程中触发combine操作;
  • 但是若只有2个或1个溢写文件,则不触发combine操作(因为combine操作,本质上是一个reduce,需要启动JVM虚拟机,有一定的开销)
小结:

shuffle主要指的是map端的输出作为reduce端输入的过程。

拓展阅读:


  1. MapReduce可简称为MR。

  2. 如果有一组大任务(复杂,计算量大,耗时较长的任务),使用单台服务器无法计算或者叫段时间内计算出结果时,可将此大任务切分成一个个小的任务,小任务分别在不同服务器上并行的执行,最终再汇总每个小任务的结果。

  3. split 是一个逻辑概念,它只包含一些元数据信息,比如 、数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。

  4. 实际情况是存在多个不同的键,然后会根据键分组,相同的键分到一个组。

  5. 将如kv对("poem", 3)和("poem", 5)键值对合并的过程,叫combine操作,将map()结果写入磁盘之前进行combine可以减少带宽消耗。

上一篇 下一篇

猜你喜欢

热点阅读