zoukankan      html  css  js  c++  java
  • MapReduce 并行编程理论基础

      对于mapreduce这一并行计算模型,一直以来都不是很清楚其具体的执行细节,今天看了学院一位老师的实验指导书,对这一过程有了一个初步的理解,特别是map阶段和reduce阶段,所以做了一份笔记,现在上传留存;

    1 MapReduce 处理过程 

    在 Hadoop 中,每个 MapReduce 任务都被初始化为一个 Job,每个 Job 又可以分为两种 阶段:map 阶段和 reduce 阶段。从下图中可以看出,MapReduce 计算模型的核心部分是 map 函数和 reduce 函数。这两个函数的具体功能有用户根据需要自己设计实现。  

     

    在 Map 阶段,MapReduce 框架将任务的输入数据分割成固定大小的片段(splits)(那么谁来分,分割的依据又是什么?这里还需要去了解),随后 将每个 split 进一步分解成一批键值对<K1, V1>。Hadoop 为每一个 split 创建一个 Map 任务 (以下简称 Mapper)用于执行用户自定义的 map 函数,(这说明将数据切割成片的并不是map函数,同时mapper调用map函数)并将对应 split 中的<K1, V1>对作为 输入,得到计算的中间结果<K2, V2>。接着将中间结果按照 K2 进行排序,并将 key 值相同 的 value 放在一起形成一个新列表,形成<K2, list(V2)>元组。最后再根据 key 值的范围将这 些元组进行分组,对应不同的 Rreduce 任务(以下简称 Reducer)。 

    在 Reduce 阶段,Reducer 把从不同 Mapper 接收来的数据整合在一起并进行排序,然后 调用用户自定义的 reduce 函数,对输入的<K2, list(V2)>对进行相应的处理,得到键值对<K3, V3>并输出到 HDFS 上。既然 MapReduce 框架为每个 split 创建一个 Mapper,那么谁来确定 Reducers 的数目呢?答案是用户。mapred-site.xml 配置文件中有一个表示 Reducers 数目的属 性 mapred.reduce.tasks,该属性的默认值为 1,开发人员可以通过 job.setNumReduceTasks()方 法重新设置该值 

    2任务调度与执行 

    MapReduce 任务由一个 JobTracker 和多个 TaskTracker 两类节点控制完成。JobTracker 主要负责调度和管理 TaskTracker,它通常情况下运行在 Master 节点上。JobTracker 将 Mappers 和 Reducers 分配给空闲的 TaskTracker 后(这说明map函数和reduce函数都是运行在slaves节点上的),由 TaskTracker 负责这些任务的并行执行。 TaskTracker 必须运行在 DataNode 上,所以 DataNode 既是数据的存储节点,也是计算节点——这就是本地计算的概念不依赖于网络宽带(我想这样可以减少因为数据传输而导致的延时)。 JobTracker 也负责监控任务的运行状况,如果某个 TaskTracker 发生故障,JobTracker 就会将 其负责的任务分配给其他空闲的 TaskTracker 重新执行。MapReduce 框架的这种设计很适合 于集群上任务的调度和执行,当然 JobTracker 的故障将引起整个任务失败,在 Hadoop 以后 的发行版本中或许会通过运行多个 JobTracker 解决这个问题。 

    备注:Hadoop MapReduce采用Master/Slave结构。

    =====================================================================

    *Master:是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce中的JobTracker。

    *Slave:负责任务的执行和任务状态的回报,即MapReduce中的TaskTracker。

    二 JobTracker剖析:

    (1)概述:JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。

     (2)JobTracker的主要功能:

    1.作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。

    *最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决策依据。

    2.资源管理。

    三 TaskTracker剖析:

    (1)TaskTracker概述:TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。

    (2)TaskTracker的功能:

    1.汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:

    *机器级别信息:节点健康情况、资源使用情况等。

    *任务级别信息:任务执行进度、任务运行状态等。

    2.执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。

    =====================================================================

    3 Shuffle 过程 

    MapReduce 会将 Mapper 的输出结果按照 key 值分成 R 份(R 是预先定义的 Reducers 的 个数),划分时常使用哈希函数,如 Hash(key) mod R。这样可以保证某一范围内的 key 一定 由某个 Reducer 来处理,从而简化 Reduce 的过程。 

    4 合并 Mapper 输出 

    正如之前所说,带宽资源非常宝贵,所以 MapReduce 允许在 Shuffle 之前先对结果进行 合并(Combine 过程),即将中间结果中有相同 key 值的多组<key, value>对合并成一对。 Combine 过程和 Reduce 过程类似,很多情况下可以直接使用 reduce 函数,但 Combine 过程 是 Mapper 的一部分,在 map 函数之后执行。Combine 过程通常情况下可以有效地减少中间 结果的数量,从而减少数据传输过程中的网络流量。值得注意的是,Hadoop 并不保证其会 对一个 Mapper 输出执行多少次 Combine 过程,也就是说,开发人员必须保证不论 Combine 过程执行多少次,得到的结果都是一样的。

    5 读取中间结果 

    在完成 Combine 和 Shuffle 的过程后,Mapper 的输出结果被直接写到本地磁盘(该节点就是一个tasktracker上,刚执行了map函数的节点)。然后, 通知 JobTracker 中间结果文件的位置,再由 JobTracker 告知 Reducer 到哪个 DataNode 上去 取中间结果。注意所有的 Mapper 产生的中间结果均按其 key 值用同一个哈希函数划分成 R 份,R 个 Reducer 各自负责一段 key 值区间。每个 Reducer 需要向多个 Mapper 节点取得落 在其负责的 key 值区间内的中间结果,然后执行 reduce 函数,形成一个最终的结果文件。 

    需要说明的是,Mapper 的输出结果被直接写到本地磁盘而非 HDFS,因为 Mapper 输出 的是中间数据,当任务完成之后就可以直接删除了,如果存储在 HDFS 上,HDFS 的备份机 制会造成性能的损失。

  • 相关阅读:
    为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
    桥接模式(透传模式)和直驱模式
    vb.net版机房收费系统——教你七层架构(三)—外观模式
    Android 4.4 KitKat NotificationManagerService使用具体解释与原理分析(二)__原理分析
    poj-2758 Checking the Text
    一种感悟,为什么努力了确还是死了一地
    一位程序员的6年总结(转)
    主键生成策略
    Linux下的crontab定时执行任务命令详解
    win7 64下安装mysql-python报错的解决办法
  • 原文地址:https://www.cnblogs.com/numen-fan/p/6627123.html
Copyright © 2011-2022 走看看