Cloud 学习笔记8.MapReduce调度

MapReduce Scheduling

Scheduler

  1. 并行Map任务
    • splitting and sharding data
    • Map任务相互独立
  2. 将数据从Map传输到Reduce
    • 相同keyMap输出会分配给同一个Reduce任务
    • 利用了partition函数,好比hash(key) % number_of_reducers
  3. 并行Reduce任务
    • Reduce任务相互独立
  4. 实现存储
    • 数据一般会有三个副本位于三个不一样的服务器上
    • Map Input: 来自分布式文件系统
    • Map Output: Map节点的本地磁盘(本地文件系统)
    • 中间数据对外部用户不可见,也没必要写到分布式文件系统上
    • Reduce Input: 远程磁盘(本地文件系统)
    • Reduce Output: 分布式文件系统

理论上,Reduce阶段只能在全部Map阶段结束以后启动(未结束的Map任务可能产生新的key/value对,对应该keyReduce任务须要等待Map完成)。这种两个阶段之间的隔离操做叫作barriernode


事实上部分Reduce任务是能够提前开始的。MapReduce中也是这样实现的。可是这种操做不利于咱们理解MapReduce范式,因此咱们先忽略这件事。服务器

Barrier不成立的缘由之一,是在Map阶段和Reduce阶段之间存在Shuffle阶段。Shuffle能够和Map并行执行。app

PS.推荐两篇文章《MapReduce:详解Shuffle过程》《MapReduce的shuffle过程详解(分片、分区、合并、归并)》,对这段shuffle的梳理实在是妙。大体解释一下:
Map任务的结果不会马上写入磁盘,而是写到一个叫环形内存缓冲区的地方(这个操做叫spill)。spill的时候,会根据key进行分区(partition)。缓冲区默认最大是100M,当写入达到阈值(默认是80%)的时候,会启动一个线程将缓冲区文件写到磁盘临时文件。而这个线程会执行一个排序(sort)和一个合并(combine)操做。整个spill执行完以后,会对全部临时文件进行归并(merge)merge时会继续进行sortcombine来减小最终输出大小。
上面这段流程就是map端的shuffle操做,里面的combine是可选的,部分状况下其实执行的是reduce分布式

因此,spill时首先进行partition,而后partitionsortcombine,最后写出到磁盘。而combine能够是reduce,因此MapReduce之间不存在Barrier函数

YARN

YARN = Yet Another Resource Negotiator. YARN是从Hadoop 2.x 开始引入的资源调度器。oop

YARN将每一个服务器当作一组容器(container)Container = some CPU + some memory。每一个容器能够执行一个任务.net

若是服务器有4个CPU和4GB内存,而每一个容器中有一个CPU和1GB的RAM。那么这个服务器有4个容器,能够运行四个任务。线程

YARN有三个主要部分:code

  • Resource Manager 资源管理器 RM
    • Resource Manager是全局进程
    • 负责调度
  • Node Manager 节点管理器 NM
    • Node Manager在每一个server都有一个
    • 做为守护进程和运行特定服务器进程(好比,任务监控)
  • Application Master 应用管理AM
    • 应用级别 per-application(job)
    • 负责containerResource ManagerNode Manager之间协商通讯
    • Node Manager通讯,检测任务挂起和从新调度

YARN分配container

两台服务器A、B:每一个服务器有一个Node Manager在运行
两个任务一、2:每一个任务有一个Application Master
全局有一个Resource Manager在运行
cdn

Timeline:

sequence environment action
0 开始时,Job2(App2)刚刚运行结束,Job1(App1)即将启动 N/A
1 Job1(App1)即将启动 Application Master1(AM_1)通知Resource Manager(RM) <App1即将启动,须要分配一个container>
2 RM收到AM_1的消息,但无可分配的container RMAM_1消息放入队列挂起,随后Node Manager B(NM_B)RM发送消息 <container空闲>
3 RM收到NM_2的消息 RM通知AM_1, node B有空闲container
4 AM_1收到RM消息 AM_1通知NM_B执行Job1

实际运行中,每一个任务会申请多个container,Resource Manager会根据申请的顺序分配container

相关文章
相关标签/搜索