zoukankan      html  css  js  c++  java
  • MapReduce简述、工作流程及新旧API对照

    什么是MapReduce?

    你想数出一摞牌中有多少张黑桃。直观方式是一张一张检查而且数出有多少张是黑桃。
    MapReduce方法则是:
    1. 给在座的全部玩家中分配这摞牌。


    2. 让每一个玩家数自己手中的牌有几张是黑桃,然后把这个数目汇报给你。
    3. 你把全部玩家告诉你的数字加起来,得到最后的结论。

    MapReduce概述

    MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题。

    它的核心设计理念是移动计算。而不是移动数据。

    MapReduce合并了两种经典函数:
    映射( Mapping)对集合里的每一个目标应用同一个操作。即。假设你想把表单里每一个单元格乘以二,那么把这个函数单独地应用在每一个单元格上的操作就属于mapping。
    化简( Reducing )遍历集合中的元素来返回一个综合的结果。

    即。输出表单里一列数字的和这个任务属于reducing。

    MapReduce由两个阶段组成: Map和Reduce,用户仅仅须要实现map()和reduce()两个函数。就可以实现分布式计算。很easy。


    这两个函数的形參是key、 value对,表示函数的输入信息。
    MapReduce在多于10PB数据时趋向于变慢。

    Mapreduce原理

    运行步骤:
    1. map任务处理
    1.1 读取输入文件内容,解析成key、 value对。 对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
    1.2 写自己的逻辑,对输入的key、 value进行处理,转换成新的key、 value输出。


    1.3 对输出的key、 value进行分区。
    1.4 对不同分区的数据,依照key**进行排序、分组**。

    同样key的value放到一个集合中。
    1.5 (可选)分组后的数据进行归约。

    2.reduce任务处理
    2.1 对多个map任务的输出,依照不同的分区,通过网络copy到不同的reduce节点。


    2.2 对多个map任务的输出进行合并、排序。 写reduce函数自己的逻辑。对输入的key、 values处理,转换成新的key、 value输出。
    2.3 把reduce的输出保存到文件里。

    MR工作流程

    1)作业配置

    1、编写Map和Reduce处理函数
    2、配置输入输出路径
    3、其它配置,如输出压缩等

    2)提交作业

    1、向JobTracker请求。getNewJobId()
    2、检查job的相关愉出路径,提交job以及相关的jar到JobTracker,
    相关的libjars是通过distributedCache方式传递到JobTracker。
    3、JobClient计算输入分片。把splitMetainInfo写入JobSplit。


    4、把job.xml配置文件发送到JobTracker。
    5、调用JobSubmissionProtocol的submitjob方法真正去提交作业。

    3)作业初始化

    1、JobTracker接收到Client的submitJob()方法调用后,会把调用放到内部队列中,交由TaskScheduler调度。
    2、创建一个代表正在运行作业的对象JoblnProgress。
    3、JoblnProgress的initTasks()方法的初始化工作:
    A.读取作业的分片信息
    B.创建Map任务与Reduce任务,为每一个Map Task和Reduce Task生成TasklnProgress对象。
    C.reduce的数最由mapred.reduce.tasks属性决定。而map的数量是由输入分片的个数决定的。

    4、任务分配

    1、JobTracker与TaskTracker之间的通信与任务分配是通过心跳机制完毕的。
    2、TaskTracker会主动向JobTracker询问是否有作业。假设自己有空暇的slot,就能够在心跳阶段得到JobTracker发送过来的Map任务或Reduce任务。
    3、TaskTracker->transmitHeatBeat。
    4、拷贝全部信息到本地(代码。配置信息。数据分片)。

    5、任务运行

    申请到任务后,TaskTracker须要做例如以下事情:
    1、拷贝代码到本地。
    2)拷贝任务信息到本地。
    3)启动JVM运行任务。
    A.代码能够查看 TaskTracker->startNewTask->localizeJob。然后调用launchTaskForJob启动taskrunner去运行task。
    B.TaskRunner分为MapTaskRunner和ReduceTaskRunner。

    6、进度和状态更新

    1、Task在运行过程中.把自己的状态发送给TaskTracker。由TaskTracker再汇报给JobTracker。
    2、任务进度是通过计数器实现的。

    7、作业完毕

    1、JobTracker在接收到最后一个任务完毕后,才会将任务标志成成功状态。


    2、同一时候会运行把中间结果后删除等操作。

    Hadoop2.6.0源代码作业提交流程

    MapReduce新旧API对照

    1、新的API倾向于使用抽象类,而不是接口。由于这更easy扩展,能够加入一个方法(用默认的实现)到一个抽象类,而不需改动类之前的实现方法。在新的API中,Mapper和Reducer都是抽象类。

    2、新的API是在org.apache.hadoop.mapreduce包(和子包)中的。之前版本号的API则是放在org.apache.hadcop.mapred中的。

    3、新的API广泛使用context.object(上下文对象),并同意用户代码与MapReduce系统进行通信。比如,MapContext基本上充当着JobConf的OutputCollector和Reporter的角色

    4、新的API统一了配置

    的API有一个特殊的JobConf对象用于作业配置,这是一个对于Hadoop通常的Configuration对象的扩展。在新的API中,这样的差别没有了。全部作业配置通过Configuration来完毕。作业控制的运行由Job类来负责。而不是JobClient。它在新的API中已经荡然无存。

  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    网页设计中颜色的搭配
    CSS HACK:全面兼容IE6/IE7/IE8/FF的CSS HACK
    UVa 1326 Jurassic Remains
    UVa 10340 All in All
    UVa 673 Parentheses Balance
    UVa 442 Matrix Chain Multiplication
    UVa 10970 Big Chocolate
    UVa 679 Dropping Balls
    UVa 133 The Dole Queue
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7168660.html
Copyright © 2011-2022 走看看