• mapreduce的计算原理


    第一章 mapreduce的计算原理

    1.MapReduce介绍

    MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)“和"Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

    MapReduce 是为处理和生成大数据集的编程模式和相应的实现。
    用户指定一个 map 函数来处理一个键值对来生成一个键值对的集合,
    和一个 reduce 函数来合并具有相同中间键的实值。

    MapReduce架构

    1. MapReduce将输入的数据集逻辑切片
    2. map任务以并行方式处理切片数据
    3. 框架对map输出进行排序,然后将数据发送给reduce
    4. MapReduce的输入输出数据存在于同一个文件系统(HDFS)
    5. 框架负责任务调度,任务监控和失败任务的重新执行

    MapReduce原语

    “相同”的key为一组,调用一次reduce方法,方法内迭代这一组数据进行计算

    输入(格式化k,v)数据集map映射成一个中间数据集(k,v)reduce

    MapReduce数据结构

    map:(K1,V1)→list(K2,V2)

    reduce:(K2,list(V2))→list(K3,V3)

    1. MapReduce处理键值对形式的很多键值对输入,生成键值对形式的很多键值对输出
    2. 框架会对键和值序列化,因此键类型和值类型需要实现Writable接口。框架会对键进行排序,因此必须实现WritableComparable接口。
      • K,V使用自定义数据类型
        • 作为参数传递,节省开发成本,提高程序自由度
        • Writable序列化:使能分布式程序数据交互
        • Comparable比较器:实现具体排序(字典序,数值序等)
    3. map输出键值对类型和reduce键值对输入类型一致
    4. map的输入键值对类型和输出键值对类型一般不一致
    5. reduce的输入键值对类型和输出键值对类型一般不一致

    2.MapReduce工作流程

    为什么叫MapReduce:MapTask & ReduceTask

    输入的数据集逻辑切片,切得越多,并行处理的越多,数据处理的越快。

    切片,Map计算,排序,将数据发送给Reduce

    • 一个大的文件分为多个block块,然后用split切片切成小块,每个小块对应一个map,实现并行计算,提高计算速度。每一个map写入到环形缓冲区中,环形缓冲区(100M)写够80M就可以写入磁盘了。环形缓冲区存在于内存中,对这些map进行分区(几个reduce就对应几个分区),排序,然后发给对应的某个reduce。在发给reduce之前,可进行一次归并排序,将相同key的归并在一起,然后调用一次reduce方法,方法内部对数据进行计算。

    • split切片:是为了调整map的数量,进行并行计算,提高计算速度。实际就是将map和block块做了一个解耦,实现用多个map对应一个block块。

    • 从文件中一行一行读数据,输出键值对,key就是这行数据的偏移量,值是这行数据。

    • 对每个键值对中的value进行处理,在这一行中,每个单词出现了几次记为键值对,key就是这个单词,value就是这个单词出现的次数。将这些键值对分好区、排好序后再落磁盘。因为如果不处理就写入磁盘的话,再进行分区排序时就需要再从磁盘中读入内存,增加工作量。

    • Reduce必须拿到所有的map数据后才可以进行计算。

    1560427556513

    1560419306200

    1560419451588

    1560419515917

    1560420952332

    Map部分

    • 读懂数据

    • 映射为KV模型

    • 并行分布式

    • 计算向数据移动

    1560419606983

    reduce部分

    • 数据全量/分量加工

    • Reduce中可以包含不同的key

    • 相同的Key汇聚到一个Reduce中

    • 相同的Key调用一次reduce方法

      • 排序实现key的汇聚

    1560419629187

    Shuffle

    • Shuffler<洗牌>:框架内部实现机制

    • 分布式计算节点数据流转:连接MapTask与ReduceTask

    1560420901014

    1560419644797

    sort阶段

    Map数据发送给reduce何时合并,是否需要落磁盘。

    1560419677859

    各个部分对应数量关系

    • block > split

      • 1:1

      • N:1

      • 1:N

    • split > map

      • 1:1
    • map > reduce

      • N:1

      • N:N

      • 1:1

      • 1:N

    • group(key)>partition(分区:对应一个reduce)

      • 1:1
      • N:1
      • N:N
      • 1:N 错误 违背了原语 不能把一组数据分给多个reduce,可以多组数据分给多个reduce
    • partition > outputfile

      • 1:1

    总结

    1. 一个reduce对应一个分区
    2. 一个map对应一个切片split
    3. reduce数量由人来决定

    1560419697129

    3.Hadoop 1.x

    运行架构:体现计算向数据移动

    客户端先启动,先去分析路径下的文件,进行split切片。

    客户端先去产生切片清单,如:基于某个文件,该文件切成了多少个切片,每个切片多大,从哪开始到哪结束,同时取出切片对应的块的位置信息。

    客户端

    • 配置文件/jar包/切片信息发送到HDFS以作业编号命名的目录中(HDFS目录)
    • 计算切片信息
    • 检查路径
    • 出发JobTracker开始分布作业

    MRv1:JobTracker和TaskTracker概述

    JobTracker

    • 调度作业
    • 资源使用情况的监控和管理
    • 从HDFS上把切片文件下载回来,然后根据资源负载情况来分析切片里的每一个map应该去到哪个节点

    Hadoop中MapReduce 的执行也是采用Master/Slave 主从结构的方式。其中JobTracker 充当了Master的角色,而TaskTracker 充当了Slave 的角色。Master负责接受客户端提交的Job,然后调度Job的每一个子任务Task运行于Slave上,并监控它们。如果发现所有失败的Task就重新运行它,slave则负责直接执行每一个Task。

    当Hadoop启动的时候,JobTracker 是作为单独的一个JVM来运行的。JobTracker 会一直等待JobClient通过RPC来提交作业,它调度处理JobClient提交的每一个任务,并监控它们的运行。当发现有失败的任务的时候,JobTracker会重新执行它。而且 TaskTracker 会一直向JobTracker发送心跳,询问JobTracker是否有任务需要处理。

    一 概述:

    (1)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)。

    1560421237598

    计算框架Mapper

    1560421259079

    计算框架Reducer

    1560421279069

    MRv1角色

    • JobTracker

      • 核心,主,单点
      • 调度所有的作业
      • 监控整个集群的资源负载
    • TaskTracker

      • 从,自身节点资源管理
      • 和JobTracker心跳,汇报资源,获取Task
    • Client

      • 作业为单位
      • 规划作业计算分布
      • 提交作业资源到HDFS
      • 最终提交作业到JobTracker

    1.x 弊端

    • JobTracker:负载过重,单点故障

    • 资源管理与计算调度强耦合,其他计算框架需要重复实现资源管理

    • 不同框架对资源不能全局管理

    4.MRv2:YARN 分布式资源调度框架

    4.1 YARN介绍

    YARN:Yet Another Resource Negotiator;

    Hadoop 2.0新引入的资源管理系统,直接从MRv1演化而来的;

    • 核心思想:将MRv1中JobTracker的资源管理和任务调度两个功能分开,分别由ResourceManager和ApplicationMaster进程实现
    • ResourceManager:负责整个集群的资源管理和调度
    • ApplicationMaster:负责应用程序相关的事务,比如任务调度、任务监控和容错等

    YARN的引入,使得多个计算框架可运行在一个集群中

    • 每个应用程序对应一个ApplicationMaster
    • 目前多个计算框架可以运行在YARN上,比如MapReduce、Spark、Storm等

    资料

    • YARN的基本思想是将JobTracker的两个主要功能(资源管理和作业调度/监控)分离,主要方法是创建一个全局的ResourceManager(RM)和若干个针对应用程序的ApplicationMaster(AM)。这里的应用程序是指传统的MapReduce作业或作业的DAG(有向无环图)。

    • YARN 分层结构的本质是 ResourceManager。这个实体控制整个集群并管理应用程序向基础计算资源的分配。ResourceManager 将各个资源部分(计算、内存带宽等)精心安排给基础 NodeManager(YARN 的每节点代理)。ResourceManager 还与 ApplicationMaster 一起分配资源,与 NodeManager 一起启动和监视它们的基础应用程序。在此上下文中,ApplicationMaster 承担了以前的 TaskTracker 的一些角色,ResourceManager 承担了 JobTracker 的角色。

    • ApplicationMaster 管理一个在 YARN 内运行的应用程序的每个实例。ApplicationMaster 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源使用(CPU、内存等的资源分配)。请注意,尽管目前的资源更加传统(CPU 核心、内存),但未来会带来基于手头任务的新资源类型(比如图形处理单元或专用处理设备)。从 YARN 角度讲,ApplicationMaster 是用户代码,因此存在潜在的安全问题。YARN 假设 ApplicationMaster 存在错误或者甚至是恶意的,因此将它们当作无特权的代码对待。

    • NodeManager 管理一个 YARN 集群中的每个节点。NodeManager 提供针对集群中每个节点的服务,从监督对一个容器的终生管理到监视资源和跟踪节点健康。MRv1 通过插槽管理 Map 和 Reduce 任务的执行,而 NodeManager 管理抽象容器,这些容器代表着可供一个特定应用程序使用的针对每个节点的资源。YARN 继续使用 HDFS 层。它的主要 NameNode 用于元数据服务,而 DataNode 用于分散在一个集群中的复制存储服务。

    • 要使用一个 YARN 集群,首先需要来自包含一个应用程序的客户的请求。ResourceManager 协商一个容器的必要资源,启动一个 ApplicationMaster 来表示已提交的应用程序。通过使用一个资源请求协议,ApplicationMaster 协商每个节点上供应用程序使用的资源容器。执行应用程序时,ApplicationMaster 监视容器直到完成。当应用程序完成时,ApplicationMaster 从 ResourceManager 注销其容器,执行周期就完成了

    4.2 MRv2作业提交流程

    作业,一般是jar包的形式。

    1. 客户端先向ResourceMananger取号,取号之后查看输入输出,看是否已指定,指定的话看路径是否存在。计算切片信息。计算完之后,将配置文件、jar包、切片信息等发送给了HDFS。

    2. 客户端向ResourceManager提交,RS会指挥调度一个NodeManager,启动一个容器container(cpu,内存),在容器里面启动一个MRAppMaster(相当于MRv1中的JobTracker)。

    3. MRAppMaster从HDFS中读取数据,计算出这个作业需要多少个Map任务,多少个Reduce任务。计算出来之后向ResourceManager请求资源,ResourceManager会调度NodeManager分配资源,NodeManager运行JVM进程,进程中运行一个MapTask或一个ReduceTask。

    4. 运行期间,NodeManager和AppMaster会进行通信,NodeManager任务运行完后会通知AppMaster,AppMaster再通知客户端任务已完成。

    1560424060873

    4.2 MRv2各个角色功能

    客户端

    • 到RM取号,作业编号

    • 检验输入目录或文件是否存在

    • 检验输出目录是否指定,并且不存在

    • 计算切片信息

    • 将配置文件/jar包/切片信息发送到HDFS以作业编号命名的目录中(HDFS目录)

    • 向RM发送请求,提交作业

    • 监控作业执行的进度,每秒发送一次请求,请求作业执行进度,如果进度有变,则

    • 在控制台打印进度信息

    • 检查源文件是否存在,输出目录一定不能存在,切片,向resourceManager取号,将数据传到HDFS后,RM运行一个MRAPPMaster。由APPMASTER和NodeManager沟通分配资源运行。

    HDFS

    • 存储配置文件/jar包/切片信息

    ResourceManager

    • 调度NodeManager,让NM分配一个容器container,运行MRAppMaster程序

    • RM会调度NodeManager分配容器,用于运行map任务或者reduce任务

    • 协调集群中计算资源的分配

    NodeManager

    • 分配容器(指cpu和内存),根据MRAppMaster的请求,运行指定的任务,map任务或者reduce任务

    • 当任务运行结束,要通知MRAppMaster,MRAppMaster做后续的处理

    • 启动并监控集群中的计算容器

    MRAppMaster

    MRAppMaster是MapReduce的ApplicationMaster实现,它使得MapReduce计算框架可以运行于YARN之上。在YARN中,MRAppMaster负责管理MapReduce作业的生命周期,包括创建MapReduce作业,向ResourceManager申请资源,与NodeManage通信要求其启动Container,监控作业的运行状态,当任务失败时重新启动任务等。

    • 负责计算的监控/失败重试/计算调度

    • 收集HDFS上的配置文件/jar包/切片信息

    • 分析出需要运行多少个Map任务,多少个reduce任务

    • 向RM发送请求,让RM分配容器,运行map任务

    • 当map任务完成5%之后,为reduce申请容器

    • 协调MapReduce作业中任务的运行,AppMaster和MapReduce任务运行于容器中,这些容器由resourcemanager调度,由nodemanager管理

    4.3 MRv2:On YARN

    MapReduce On YARN:MRv2

    将MapReduce作业直接运行在YARN上,而不是由JobTracker和TaskTracker构建的MRv1系统中

    基本功能模块

    • YARN:负责资源管理和调度
    • MRAppMaster:负责任务切分、任务调度、任务监控和容错等
    • MapTask/ReduceTask:任务驱动引擎,与MRv1一致

    每个MapRduce作业对应一个MRAppMaster

    • MRAppMaster任务调度

    • YARN将资源分配给MRAppMaster

    • MRAppMaster进一步将资源分配给内部的任务

    MRAppMaster容错

    • 失败后,由YARN重新启动

    • 任务失败后,MRAppMaster重新申请资源

    1560426847456

    YARN:解耦资源与计算

    • ResourceManager

      • 主,核心

      • 集群节点资源管理

    • NodeManager

      • 与RM汇报资源
      • 管理Container生命周期
      • 计算框架中的角色都以Container表示
    • Container:【节点NM,CPU,MEM,I/O大小,启动命令】

      • 默认NodeManager启动线程监控Container大小,超出申请资源额度,kill
      • 支持Linux内核的Cgroup

    MR

    • MR-ApplicationMaster-Container

      • 作业为单位,避免单点故障,负载到不同的节点
      • 创建Task需要和RM申请资源(Container)
    • Task-Container

    Client:

    • RM-Client:请求资源创建AM

    • AM-Client:与AM交互

  • 相关阅读:
    大厂Redis高并发场景设计,面试问的都在这!
    POJ1006——中国剩余定理
    HDU3501——欧拉函数裸题
    堆-动态的排序(洛谷1801-黑匣子)
    图中欧拉回路数量
    ip地址
    网络通信概述
    网络通信概述
    软件安装与卸载
    软件安装与卸载
  • 原文地址:https://www.cnblogs.com/chenxiaoge/p/13335463.html
Copyright © 2020-2023  润新知