(1)概念
先分再合,分而治之
map 对一组数据元素进行某种重复式的处理
reduce 对Map的中间结果进行某种进—步的结果整理。
(2)抽象编程模型
MapReduce中定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现

  • map:(k1;V1) --> (k2;V2)
  • reduce:(k2;V2) --> (k3;V3)

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

(3)统一架构、隐藏底层细节

  • 如何提供统一的计算框架,如果没有统一封装底层细节,那么程序员则需要考虑诸如数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此,MapReduce设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统层面的处理细节。
  • MapReduce最大的亮点在于通过抽象模型和计算框架把需要做什么(what need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高层的编程接口和框架。
  • 程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的业务程序代码。
  • 至于如何具体完成这个并行计算任务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理∶从分布代码的执行,到大到数千小到单个节点集群的自动调度使用。

一、MapReduce

概述

  • 分布式计算框架
  • 用于轻松比那些分布式应用程序,这些程序以可靠、容错的方式并行处理大型硬件集群上的大量数据
  • 数据处理的指导思想

特点

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

弱点

  • 实时计算性能差
  • 不适合流式数据处理

架构体系

一个Map和一个Reduce

编写规范

整体

  • 用户编写的程序代码分为三个部分:Mapper;Reducer;Driver
  • 用户自定义的Mapper和Reduce都要继承各自的父类。
    • Mapper中的业务逻辑写在map( )方法中;
    • Reducer的业务逻辑写在reduce( )方法中。
  • 整个程序徐娅一个Driver来进行提交,提交的是一个描述了各种必要信息的job对象。

细节

  • 整个Map Reduce程序中,数据都是以kv键值对的形式流转的;
  • 实际编写中,每个阶段的输入输出KV分别是什么
  • MapReduce内置了很多默认属性,比如排序、分组,都与数据的k有关,所以说kv的类型数据确定极其重要的。

内部执行流程

虽然MapReduce从外表来看只有Map和Reduce两个阶段,但是内部包含了很多默认组件和默认行为。

比如, map去读数据,是怎样读数据呢?是否用户去创建IO流来读取呢? 当Map完成之后,怎么去写数据? ……

组件:读取数据组件InputFormat、输出数据组件OutputFormat
行为:排序( key的字典序排序)、分组 (reduce阶段key相同的分为一组,一组调用一次reduce处理)
image.png