深入理解MapReduce原理

1. 概念
百度百科对MapReduce的定义感觉还是比较全面的:

MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义:
1)MapReduce是一个基于集群的高性能并行计算平台。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。
2)MapReduce是一个并行计算与运行软件框架。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。
3)MapReduce是一个并行程序设计模型与方法。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理。

用自己的话概况一下:

MapReduce是一个基于集群的计算平台,是一个简化分布式编程的计算框架,是一个将分布式计算抽象为Map和Reduce两个阶段的编程模型。(这句话记住了是可以用来装逼的)

  1. 执行流程

MapReduce运行原理
由图我们可以看到, MapReduce存在以下4个独立的实体。

  1. JobClient:运行于client node,负责将MapReduce程序打成Jar包存储到HDFS,并把Jar包的路径提交到Jobtracker,由Jobtracker进行任务的分配和监控。
  2. JobTracker:运行于name node,负责接收JobClient提交的Job,调度Job的每一个子task运行于TaskTracker上,并监控它们,如果发现有失败的task就重新运行它。
  3. TaskTracker:运行于data node,负责主动与JobTracker通信,接收作业,并直接执行每一个任务。
  4. HDFS:用来与其它实体间共享作业文件。

各实体间通过以下过程完成一次MapReduce作业。

  • JobClient通过RPC协议向JobTracker请求一个新应用的ID,用于MapReduce作业的ID

  • JobTracker检查作业的输出说明。例如,如果没有指定输出目录或目录已存在,作业就不提交,错误抛回给JobClient,否则,返回新的作业ID给JobClient

  • JobClient将作业所需的资源(包括作业JAR文件、配置文件和计算所得得输入分片)复制到以作业ID命名的HDFS文件夹中

  • JobClient通过submitApplication()提交作业

  • JobTracker收到调用它的submitApplication()消息后,进行任务初始化

  • JobTracker读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个TaskTracker

  • TaskTracker通过心跳机制领取任务(任务的描述信息) TaskTracker读取HDFS上的作业资源(JAR包、配置文件等)

  • TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)

  • TaskTracker将Reduce结果写入到HDFS当中

工作原理

Map任务处理

  • 读取HDFS中的文件。每一行解析成一个。每一个键值对调用一次map函数
  • 重写map(),对第一步产生的进行处理,转换为新的输出
  • 对输出的key、value进行分区
  • 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中
  • (可选) 对分组后的数据进行归约

Reduce任务处理

  • 多个map任务的输出,按照不同的分区,通过网络复制到不同的reduce节点上
  • 对多个map的输出进行合并、排序。
  • 重写reduce函数实现自己的逻辑,对输入的key、value处理,转换成新的key、value输出
  • 把reduce的输出保存到文件中

你可能感兴趣的:(Java)