hadoop系列(12)---Hadoop计算组件MapReduce(一)

463 阅读3分钟

这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

介绍

概述

Hadoop MapReduce 是一个分布式计算框架,用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。

MapReduce 作业通过将输入的数据集拆分为独立的块,这些块由 map 以并行的方式处理,框架对 map 的输出进行排序,然后输入到 reduce 中。MapReduce 框架专门用于 <key,value> 键值对处理,它将作业的输入视为一组 <key,value> 对,并生成一组 <key,value> 对作为输出。输入和输出的 key 和 value 都必须实现Writable 接口。

特点

  • 易于编程
  • 良好的扩展性
  • 高容错性
  • 适合海量数据离线处理

(1)概念

先分再合,分而治之

(2)抽象编程模型

MapReduce中定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现

(input) <k1, v1> -> **map** -> <k2, v2> -> **combine** -> <k2, v2> -> **reduce** -> <k3, v3> (output)

通过以上的两个编程接口,可以发现MapReduce处理的数据类型是<key,value>键值对。

编程模型简述

在MapReduce计算中有这流水线的计算工序。

如下图:

68747470733a2f2f67697465652e636f6d2f68656962616979696e672f426967446174612d4e6f7465732f7261772f6d61737465722f70696374757265732f6d617072656475636550726f636573732e706e67.png

主要有这么几个阶段

  • 输入数据

    这个输入数据就是,每一个 DataNode 上面的 block 块

  • 拆分 (splits)

一个分片对于着一个 map 任务

输入到 MapReduce 的数据,首先被切分成固定大小的片段叫做 input splits ,一个片段对应着一个 map

==一般来说会把一个 block 当作一个 片段,但是细粒度的分片,将会有更好的负载均衡==

  • 映射(Mapping) 给它一堆键值对,输出新的键值对

==map的数量就是上面分段的数量== ==maping是在有数据 DataNode 上面跑==

这是我们的 MapReduce 程序执行的第一个个阶段,在这个阶段中,传递给 map 的片段里面的数据,就会被映射成键值对,比如 计算(某个单词出现的个数),具体是什么键值对,就由我们具体的代码实现。

这里有一个缓存区的概念,每次 map输出的东西会先保存到缓存区里面,当缓冲区超过80%后,就会缓冲区里面的数据写到磁盘里面(不是 HDFS),然后缓冲区继续使用,当map跑完以后,就会把缓冲区文件合并

  • 混洗 (shuffle)(排序分组)

==shuffle 是在 map和reduce中间的一个阶段,可以把它归为reduce阶段==

shuffle 可以把 map 阶段输出的值,按照某种 key 值,重新的排序和组合(比如把相同的东西放到一起),把key值符合某种范围的输出送到特定的reduce那里去处理

它可以简化 reduce 的过程

我们把排序归于 map,我们把组合归于 reduce

输入与输出

  • Map 阶段 输入 <key,value> <'行号','a b c'>

输出 <newkey, newvalue> <a,1> <b,1> <c,1>

  • reduce 阶段 输入 <key, value-list>

输出 <key, value>