MapReduce
- MapReduce概述
- e.g. MapReduce
- MapReduce 案例2:统计字数 Word Count
MapReduce概述
MapReduce 主要用于搜索领域,解决海量数据的计算问题,在大数据领域处理海量数据的关键,在于分布式的存储和计算。
对于大数据的分布式计算,我们需要专门的模型来进行抽象。解决我们应该怎样分发数据,并行处理,并保证故障后可以正常恢复的问题。
我们今天要说的 MapReduce,就是这样的一个编程模型。
MapReduce,顾名思义,可以分为两个部分,Map 和 Reduce。
Map 含义为 “映射”,主要指对数据的提取,转换操作;
Reduce 含义为 “归约”,主要指将一组有共同点的数据进行聚合,得到一个统计值。
大部分数据的计算,都可以抽象成两个部分
先把数据映射转换成一组键值对;(Map)
然后对所有具有相同键的数据进行规约和聚合。(Reduce)
这就是著名的 MapReduce编程模型。
有了这个模型,我们就可以通过简单的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的示例。
Map:对数据的提取;
Reduce:对数据进行聚合。
MapReduce 案例2:统计字数 Word Count
txt1: Deer Bear River
txt2: Car Car River
txt3: Deer Car Bear
首先,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~~