第一章 mapreduce的计算原理
1.MapReduce介绍
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)“和"Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
MapReduce 是为处理和生成大数据集的编程模式和相应的实现。
用户指定一个 map 函数来处理一个键值对来生成一个键值对的集合,
和一个 reduce 函数来合并具有相同中间键的实值。
MapReduce架构
- MapReduce将输入的数据集逻辑切片
- map任务以并行方式处理切片数据
- 框架对map输出进行排序,然后将数据发送给reduce
- MapReduce的输入输出数据存在于同一个文件系统(HDFS)
- 框架负责任务调度,任务监控和失败任务的重新执行
MapReduce原语
“相同”的key为一组,调用一次reduce方法,方法内迭代这一组数据进行计算
输入(格式化k,v)数据集map映射成一个中间数据集(k,v)reduce
MapReduce数据结构
map:(K1,V1)→list(K2,V2)
reduce:(K2,list(V2))→list(K3,V3)
- MapReduce处理键值对形式的很多键值对输入,生成键值对形式的很多键值对输出
- 框架会对键和值序列化,因此键类型和值类型需要实现Writable接口。框架会对键进行排序,因此必须实现WritableComparable接口。
- K,V使用自定义数据类型
- 作为参数传递,节省开发成本,提高程序自由度
- Writable序列化:使能分布式程序数据交互
- Comparable比较器:实现具体排序(字典序,数值序等)
- map输出键值对类型和reduce键值对输入类型一致
- map的输入键值对类型和输出键值对类型一般不一致
- 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
总结
- 一个reduce对应一个分区
- 一个map对应一个切片split
- 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的主要功能:
- 作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。
最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。
主要作用:容错和为任务调度提供决策依据。 - 资源管理。
三 TaskTracker剖析:
(1) TaskTracker概述:TaskTracker是JobTracker和Task之间的桥梁:
一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;
另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。
TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。
(2) TaskTracker的功能:
- 汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:
- 机器级别信息:节点健康情况、资源使用情况等。
- 任务级别信息:任务执行进度、任务运行状态等。
- 执行命令: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包的形式。
- 客户端先向ResourceMananger取号,取号之后查看输入输出,看是否已指定,指定的话看路径是否存在。计算切片信息。计算完之后,将配置文件、jar包、切片信息等发送给了HDFS。
- 客户端向ResourceManager提交,RS会指挥调度一个NodeManager,启动一个容器container(cpu,内存),在容器里面启动一个MRAppMaster(相当于MRv1中的JobTracker)。
- MRAppMaster从HDFS中读取数据,计算出这个作业需要多少个Map任务,多少个Reduce任务。计算出来之后向ResourceManager请求资源,ResourceManager会调度NodeManager分配资源,NodeManager运行JVM进程,进程中运行一个MapTask或一个ReduceTask。
- 运行期间,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交互