欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Mapreduce 原理和 YARN

最编程 2024-03-28 21:08:33
...

这是我参与更文挑战的第3天 ,活动详情查看更文挑战

MapReduce定义

MapReduce是一种分布式计算框架,由Google公司2004年首次提出,并贡献给Apache基金会。

MR版本

  • MapReduce 1.0,Hadoop早期版本(只支持MR模型)
  • MapReduce 2.0,Hadoop 2.X版本(引入了YARN资源调度框架后,除了支持MR,还支持其他计算模型

image.png

MR V1 执行流程

image.png

  1. JobTracker一直在等待JobClient提交作业;
  2. TaskTracker每隔3秒向 JobTracker发送心跳heartbeat询问有没有任务可做,如果有,让其派发任务给它执行;
  3. 这是一道pull过程: slave主动向master拉生意;

image.png

MR v2 vs MR v1 流程

MR v2运行机制的改进,启动了YARN

  1. 增加了ResourceManager、NodeManager;
  2. ResourceManager(RM), 包含:ApplicationManager、ResourceScheduler两种功能;即把应用管理和资源调度分开;
  3. NodeManager(NM)负责节点的运行,当收到任务时,启动Container完成(map或reduce)任务;
  4. ResourceManager对应于v1的JobTracker;
  5. NodeManager对应于v1的TaskTracker

MR V2 执行流程

  1. 用户向YARN中提交应用程序,其中包括MR App Mstr程序、启动ApplicationMaster的命令、数据等。
  2. ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
  3. ApplicationMaster首先向ResourceManager注册,这样,用户可以直接通过ResourceManager查看应用程序的运行状态,然后,它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7
  4. ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
  5. 一旦ApplicationMaster申请到资源后,则与对应的NodeManager通信,要求其启动任务。
  6. NodeManager为任务设置好运行环境(包括环境变量、jar包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
  7. 各个任务通过某个RPC 协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC 向ApplicationMaster 查询应用程序的当前运行状态。
  8. 应用程序运行完成后,ApplicationMaster 向ResourceManager 注销并关闭自己。

image.png

Resource Container, 资源容器

1)是集群节点将自身内存、CPU、磁盘等资源封装在一 起的抽象概念;

2)调度器根据应用的资源需求和集群各个节点的资源容 器进行调度;

3)RM的应用管理器负责接收作业,协商获取第一个资源 容器用于执行应用的任务主体并为重启失败的应用主体分 配容器;

4)DN节点的应用主体负责通过协商从调度器获取资源容 器,并跟踪这些容器的状态和应用执行的情况

Mapper任务流程

image.png ① 读取输入文件,解析成key、value对。对输入文件的每 一行(k1,v1),解析成多个key、value对(k2,v2)。每 个(k1、v1)键值对调用一次map函数;

② 写代码逻辑将输入的k1、v1处理成新的k2、v2输出;

③ 对输出的k2、v2进行分区(如果不指定默认1个分区, 分区号为0);

④ 对不同分区的数据,按照k2进行排序、分组。相同k2的 v2放到集合v2’ ={v21 ,v22 ,v23 ,…v2n}中;

⑤ (可选)分组后的数据进行归约(combiner);

⑥ Mapper的结果写入本地磁盘

Reducer任务流程

① 对多个map任务的输出,按照不同的分区,通过网络 复制到不同的reduce节点(取map端的结果数据);

② 一个Reduce任务处理一个分区数据;

③ 对属于当前分区的多个map任务的输出结果进行合并 、排序。写reduce函数的代码,对输入的k2,v2’处理 ,转换成新的k3、v3输出;

④ 把reduce的输出保存到文件中。文件名为 part-r- 0000N

MapReduce核心概念

  • 不同的Map任务之间不会进行通信
  • 不同的Reduce任务之间也不会发生任何信息交换
  • 用户不能显式地从一台机器向另一台机器发送消息
  • 所有的数据交换都是通过MapReduce框架自身去实现的

image.png

文件输入格式InputFormat

定义了数据文件如何分割和读取。InputFile提供了以下一些功能

  • 选择文件或者其它对象,用来作为输入
  • 定义InputSplits, 将一个文件分为不同任务
  • 为RecordReader提供一个工厂,用来读取这个文件

例如:有一个抽象的类FileInputFormat, FileInputFormat从这个目录中读取 所有文件,然后FileInputFormat将 这些文件分割为多个InputSplits。

输入数据分块InputSplits

InputSplit定义了输入到单个Map任务的输入数据

  • 一个MapReduce程序被统称为一个Job,可能有上百个任务构成
  • InputSplit将文件分为128MB的大小

数据记录读入RecordReader

InputSplit定义了一个数据分块,但是没有定义如何读取数据记录。RecordReader实际上定义了如何将数据记录转化为一个(key,value)对的详细方法,并将数据记录传给Mapper类。

例如:TextInputFormat提供了 LineRecordReader,读入一个文 本行数据记录

Mapper

每一个Mapper类的实例生成了一 个Java进程,负责处理某一个 InputSplit上的数据

  • V1中,有两个额外参数OutputCollector以及Reporter,前者收集中间结果,后者获得环境参数以及设当前执行的状态。
  • 现在的版本V2用Context提供给每一个Mapper函数,用来提供上面两个对象的功能

Combiner

对Map端的输出进行合并,即合并相同key的键值对,以便 减少partitioner数据通信开销。 可以不用指定;如果指定合并类,其性质类似于本地执行 的一个Reducer,满足一定的条件才能够执行

Partitioner & Shuffle&Sort

  • Partitioner & Shuffle 在Map工作完成之后,每一个 Map函数的结果会被传输到对 应Reducer所在的节点,此时用户可以提供一个Partitioner 类,用来决定一个给定的(key,value)对传给哪个节点。

  • Sort 传输到每一个Reducer节点上的、将被所有的Reduce函数接 收到的Key,value对会被Hadoop自动排序(即Map生成的结 果传送到某一个节点的时候,会被自动排序)

Shuffle

Shuffle过程就是从map端输出到reduce端输入之间的过程;是Hadoop中最核心的部分!!!

image.png

Shuffle的Map端

  1. 在Map任务全部结束之前进行归并
  2. 归并得到大的文件放在本地磁盘
  3. 文件归并时,如果溢写文件数量大于预定值(默认是3)则可以再次启动Combiner,少于3不需要
  4. JobTracker会一直监测Map任务的执行,并通知Reduce任务来领取数据

Shuffle的Reduce端

  1. Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据
  2. Reduce领取数据先放入缓存,来自不同Map机器,先归并,再合并写入磁盘
  3. 多个溢写文件归并成一个或多个大文件,文件中的键值对是排序的
  4. 当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce

Reducer

做用户定义的Reduce操作。 编程接口是Context。 一个分区对应一个Reducer。 每个分区对应一个输出文件 part-r-0000X。

文件输出格式OutputFormat

写入到HDFS的所有OutputFormat 都继承自FileOutputFormat 。 每一个Reducer都写一个文件到一 个共同的输出目录,文件名是part- nnnnn,其中nnnnn是与每一个 reducer相关的一个号(partition id)

MapReduce-任务执行总结

  1. 提交作业
  2. 初始化作业
  3. 分配任务
  4. 执行任务
  5. 更新任务执行进度和状态

推测式执行(speculative) –如果某个节点的任务执行过慢,会启动备份任务

YARN定义

YARN 是Hadoop 2.0 中的资源管理系统 ,它是一个通用的资源管理模块,可为 各类应用程序进行资源管理和调度。

YARN三大组件

image.png

  1. ResourceManager –处理客户端请求
  • 启动/监控ApplicationMaster
  • 监控NodeManager
  • 资源分配与调度
  1. NodeManager –单个节点上的资源管理
  • 处理来自ResourceManager的命令
  • 处理来自ApplicationMaster的命令
  1. ApplicationMaster
  • 数据切分
  • 为应用程序申请资源,并分配给内部任务
  • 任务监控与容错

YARN资源调度器

  • FIFO,先进先出调度器
  • Fair Scheduler,公平调度器
  • Capacity Scheduler,容量调度器