第一章 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比较器:实现具体排序(字典序,数值序等)
  1. map输出键值对类型和reduce键值对输入类型一致
  2. map的输入键值对类型和输出键值对类型一般不一致
  3. 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数据后才可以进行计算。



Map部分

  • 读懂数据
  • 映射为KV模型
  • 并行分布式
  • 计算向数据移动


reduce部分

  • 数据全量/分量加工
  • Reduce中可以包含不同的key
  • 相同的Key汇聚到一个Reduce中
  • 相同的Key调用一次reduce方法
  • 排序实现key的汇聚


Shuffle

  • Shuffler<洗牌>:框架内部实现机制
  • 分布式计算节点数据流转:连接MapTask与ReduceTask



sort阶段

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


各个部分对应数量关系

  • 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数量由人来决定


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。这些信息包括两部分:
  • 机器级别信息:节点健康情况、资源使用情况等。
  • 任务级别信息:任务执行进度、任务运行状态等。
  1. 执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。


计算框架Mapper


计算框架Reducer


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再通知客户端任务已完成。


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重新申请资源


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交互