这是我参与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计算中有这流水线的计算工序。
如下图:
主要有这么几个阶段
-
输入数据
这个输入数据就是,每一个 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>