MapReduce

  • MapReduce概述
  • e.g. MapReduce

  • MapReduce 案例2:统计字数 Word Count


MapReduce概述

MapReduce 主要用于搜索领域,解决海量数据的计算问题,

redis map 能存的数据量 redis mapreduce_Hadoop

在大数据领域处理海量数据的关键,在于分布式的存储和计算。

对于大数据的分布式计算,我们需要专门的模型来进行抽象。解决我们应该怎样分发数据,并行处理,并保证故障后可以正常恢复的问题。

我们今天要说的 MapReduce,就是这样的一个编程模型。

MapReduce,顾名思义,可以分为两个部分,MapReduce

Map 含义为 “映射”,主要指对数据的提取,转换操作;

Reduce 含义为 “归约”,主要指将一组有共同点的数据进行聚合,得到一个统计值。

redis map 能存的数据量 redis mapreduce_大数据_02

大部分数据的计算,都可以抽象成两个部分

先把数据映射转换成一组键值对;(Map)

然后对所有具有相同键的数据进行规约和聚合。(Reduce)

这就是著名的 MapReduce编程模型

redis map 能存的数据量 redis mapreduce_redis map 能存的数据量_03

有了这个模型,我们就可以通过简单的Mapper和Reducer接口,在普通PC机构建的集群上,实现大规模的分布式并行计算。

我们只需要定义每一步Map和Reduce到底做什么操作。而不用考虑底层的数据传输、并行计算以及容错机制。

值得一提的是,Apache 以及 Hadoop 大数据框架也基于MapReduce技术实现自己的大数据集并行处理系统。

用户可以在 Hadoop MapReduce 中轻松的编写程序,在成千上万的节点构成的大型集群上,以可靠、容错的方式并行处理海量数据。
所以MapReduce在广义上是一种编程模型,狭义上则指的是Hadoop的分布式计算组件。

Hadoop有两大组件:MapReduce 和 HDFS

在 Hadoop 中的 MapReduce 作业,通常会将输入的数据集分割成为独立的块,由Map任务并行处理,然后对Map的输出进行排序,再输入给Reduce任务。(后续有范例)

HDFS: 作业的输入和输出,都会存储再Hadoop的分布式文件系统中,也就是HDFS上。

通常Hadoop中的计算节点和存储节点是相同的,也就是说,Hadoop的两大组件,MapReduce和HDFS是在同一节点上运行的。

这种配置,可以允许框架在已经存在数据的节点上,有效地调动任务。也就是:数据不动,计算任务动;

这样就可以在整个集群中产生非常高的聚合带宽。

MapReduce 缺点?

  • MapReduce中只有Map和Reduce两种操作,使得其在架构上过于底层。对于复杂逻辑的实现,可能就需要写很多个MapReduce任务,十分麻烦;
  • 而且MapReduce的中间计算结果会全部写入文件系统,需要大量的磁盘IO与网络IO操作,会严重影响性能。

因此 Hadoop MapReduce 一般只适用于离线数据的处理计算。不太适合实时的流式处理和迭代计算。

所以现在的大数据处理架构中,很多项目会使用 Spark Flink 这样的新计算引擎来替代MapReduce。

虽然MapReduce有缺点,但是其成为大数据计算框架的标准模板,重要性还是不要忽视的。

以上便是对MapReduce的介绍,下面将具体给出一个计算MapReduce的示例。


redis map 能存的数据量 redis mapreduce_大数据_04

redis map 能存的数据量 redis mapreduce_mapreduce_05


Map:对数据的提取;

Reduce:对数据进行聚合。


MapReduce 案例2:统计字数 Word Count

txt1: Deer Bear River
txt2: Car Car River
txt3: Deer Car Bear

redis map 能存的数据量 redis mapreduce_hadoop_06


首先,Mapping 对三个文本进行信息分割与提取,得到键值对:

txt

key,value

txt1

Deer,1; Bear,1; River,1;

txt2

Car,1; Car,1; River,1;

txt3

Deer,1; Car,1; Bear,1;

然后,Redcuing进行信息的聚合,得到最终的键值对结果。

key

Value

Bear

2

Car

3

Deer

2

River

2

总结来看,可以将Map与Reduce的作用归结如下:

Map(): input data → (key, value) pairs
产生中间的键值对信息;

Reduce(): (key, value) pairs → result
产生中间值得聚合,合并到输出值。


end~~