Hadoop1.0-MapReduce介绍

一、MapReduce介绍

MapReduce是一种编程模型式,它是与处理/产生海量数据集的实现相关。用户指定一个map函数,通过这个map函数处理key/value(键/值)对,并且产生一系列的中间key/value对,并且使用reduce函数来合并所有的具有相同key值的中间键值对中的值部分。

1、MapReduce处理大数据的基本构思:

A、对付大数据处理----分而治之

对相互间不具有计算依赖关系的大数据,实现并行计算最有效的办法,就是采取分而治之的策略

B、构建抽象模型----MapReduce

实现并行计算的编程模型

C、上升到构架----自动并行化,并隐藏低层细节实现

一般的并行化处理,程序员需要考虑数据存储、划分、分发、结果收集、错误恢复等诸多细节。MapReduce设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统层面的处理细节。

 

2、如何提供统一的计算框架

A、主要需求和目标

  • 实现自动并行化计算
  • 为程序员隐藏系统层面的细节
  • 需要考虑的细节技术问题:
  • 如何管理和存储数据?如何划分数据?
  • 如何调度计算任务并分配 map reduce 节点?
  • 如果节点间需要共享或交换数据,怎么办?
  • 如何考虑数据通信和同步?
  • 如何掌控节点的执行完成情况?如何收集中间和最终的结果数据?
  • 节点失效如何处理?如何恢复数据?如何恢复计算任务?
  • 节点扩充后,如何保证原有程序仍能正常运行并保证系统性能提升?

B、提供统一的计算框架,可完成:

  • 计算任务的划分和调度
  • 数据的分布存储和划分
  • 处理数据与计算任务的同步
  • 结果数据的收集整理
  • 系统通信、负载平衡、计算性能优化处理
  • 处理系统节点出错检测和失效恢复

C、最大亮点:

  • 通过抽象模型和计算框架,把需要做什么与具体怎么做分开了,为程序员提供一个抽象和高层的编程接口和框架
  • 程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的程序代码
  • 如何具体完成这个并行计算任务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理:从分布代码的执行,到大到数千小到单个节点的自动调试使用

   二、MapReduce 1.0基本组成结构介绍

1JobTracker:

 JobTracker是整个MapReduce计算框架中的主服务,相当于集群的管理者,负责整个集群的作业控制和资源管理。

1)作业控制模块,负责作业的分解和状态的监控。
其中,最重要的是状态的监控,主要包括TaskTracker状态监控、作业状态监控、任务状态监控等。其最主要的作用有两个:容错和为任务调度提供决策依据。

2)资源管理模块,是通过一定的策略,将各个节点上的计算资源分配给集群中的任务。

2TaskTracker:

TaskTrackerHADOOP集群中运行于各个节点上的服务。负责任务的执行和汇报心跳;

1) 任务执行:JobTracker端接收并执行各种命令(如:启动任务、提交任务、杀死任务、杀死作业、重新初始化等);

2) 汇报心跳:周期性地将所在节点上的各种信息,通过心跳机制汇报给JobTracker。信息包括:节点健康信息、资源使用情况、任务执行进度、任务运行状态等.

三、MapReduce作业运行流程

 

1.在客户端启动一个作业。

2.JobTracker请求一个Job ID

3.将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门为该作业创建的文件夹中。文件夹名为该作业的Job ID

4.客户端提交作业,JobTracker接收到作业请求。

5. JobTracker将其放在一个作业队列里,等待作业调度器对其进行调度。

6.当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行。

7.TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。

8. 对于mapreduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。这里需要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫运算移动,数据不移动。而分配reduce任务时并不考虑数据本地化。

9.JobTracker收到作业的最后一个任务完成信息时,便把该作业设置成成功。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户。

 

四、MapReduce编程模型

Map Task分解成ReadMapCollectSpillCombine五个阶段,Reduce Task分解成ShuffleMergeSortReduceWrite五个阶段。

 

1、MapReduce编程模型

根据运行顺序,主要由以下五部分组成:

1 InputFormat

主要用于描述输入数据的格式。

提供以下两个功能:

1) 数据切分:按照某个策略将输入数据切分成若干个split,以便确定Map Task个数以及对应的split

2) Mapper提供输入数据:给定某个split,能将其解析成一个个key/value对。

包含算法:

1) 文件切分算法:用于确定InputSplit的个数,以及每个InputSplit对应的数据段;

2) Host选择算法:确定每个InputSplit的元数据信息;

2 Map

1) 初始化:对Map的运行,进行初始化处理;

2) Map操作:调用用户实现的Map方法,对一个个key/value对进行处理;

3) 清理:对Mapper进行清理;

3 Partitioner

Mpaaer产生的中间结果进行分片,以便将同一分组的数据交给同一个Reduce处理,它直接影响到Reduce阶段的负载均衡;

4 Reduce

1) 初始化:对Reduce的运行,进行初始化处理;

2) Map操作:调用用户实现的Reduce方法,对各个key/value组对进行处理;

3) 清理:对Reduce进行清理;

5 OutputFormat

主要用于描述输出数据的格式,它能够将Reduce输出的key/value对写入特定格式的文件中。

1) 实现checkOutputSpecs接口:检查用户配置的输出目录是否存在,如果存在则抛出异常,以防止之前的数据被覆盖;

2) 处理side-effect file:对于运行缓慢的任务,会在另外一个节点上启动一个相同的任务,当其中一个完成任务时,会kill掉另外一个还没完成的任务。任务运行过程中,会把输出结果先写在side-effect file中,当任务完成时,才把结果移动到用户指定的输出目录中。

 

2、Map Task整体流程

1) Read阶段:Map Task通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value

2) Map:将解析出的key/value交给用户编写的map()函数处理,并产生一系列新的key/value

3) Collect:当Map处理完数据后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分片(通过调用Partitioner),并写入一个环形内存缓冲区中;

4) Spill:即溢写,当环形内存缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作;

5) Combine:当所有数据处理完成后,Map Task对所有临时文件进行一次合并,以确保最终只会生成一个数据文件;

3、Reduce Task整体流程

1) Shuffle阶段:也称为copy阶段,Reduce Task从各个Map Task上远程拷贝一片数据,对针对某一片数据,如果其大小超过一定的阈值,则写到磁盘上,否则直接放到内存中;

2) Merge:在远程拷贝数据的同时,Reduce Task启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多;

3) Sort:为了将key相同的数据聚在一起,采用了基于排序的策略。由于各个Map Task已经实现对自己的处理结果进行了局部排序,因此,Reduce Task只需对所有数据进行一次归并排序即可;

4) Reduce:将每组数据依次交给用户编写的reduce()函数处理;

5) Write:将计算结果写到hdfs上;

猜你喜欢

转载自szjian.iteye.com/blog/2100848
今日推荐