3.1.4 Hadoop, Yarn, 资源调度策略, Apache Hadoop核心源码分析, Hadoop 3.x 新特性概述

目录

第七部分 YARN资源调度

第 1 节 Yarn架构

第 2 节 Yarn任务提交(⼯作机制)

第 3 节 Yarn调度策略

第 4 节 Yarn多租户资源隔离配置

第⼋部分 Apache Hadoop HDFS核⼼源码剖析

第 1 节 源码阅读准备

第 2 节 NameNode 启动流程

第 3 节 DataNode 启动流程

第 4 节 写数据流程

第 5 节 NameNode如何⽀撑⾼并发访问(双缓冲机制)

扩展 Hadoop 3.x 新特性概述

 Hadoop3.x新特性之Common改进

Hadoop3.x新特性之HDFS改进

 Hadoop3.x新特性之YARN改进

Hadoop3.x新特性之MapReduce改进

Hadoop3.x新特性之其他


第七部分 YARN资源调度

第 1 节 Yarn架构

ResourceManager(rm):处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度;

NodeManager(nm):单个节点上的资源管理、处理来⾃ResourceManager的命令、处理来⾃ApplicationMaster的命令;

ApplicationMaster(am):数据切分、为应⽤程序申请资源,并分配给内部任务、任务监控与容错。

Container:对任务运⾏环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运⾏相关的信息。

第 2 节 Yarn任务提交(⼯作机制)

作业提交过程之YARN (要能复述出来)

作业提交

第1步:Client调⽤job.waitForCompletion⽅法,向整个集群提交MapReduce作业。

第2步:Client向RM申请⼀个作业id。

第3步:RM给Client返回该job资源的提交路径和作业id。

第4步:Client提交jar包、切⽚信息和配置⽂件到指定的资源提交路径。

第5步:Client提交完资源后,向RM申请运⾏MrAppMaster。

作业初始化

第6步:当RM收到Client的请求后,将该job添加到容量调度器中。

第7步:某⼀个空闲的NM领取到该Job。

第8步:该NM创建Container,并产⽣MRAppmaster。

第9步:下载Client提交的资源到本地。

任务分配

第10步:MrAppMaster向RM申请运⾏多个MapTask任务资源。

第11步:RM将运⾏MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。

任务运⾏

第12步:MR向两个接收到任务的NodeManager发送程序启动脚本,这两个
NodeManager分别启动MapTask,MapTask对数据分区排序。

第13步:MrAppMaster等待所有MapTask运⾏完毕后,向RM申请容器,运⾏ReduceTask。

第14步:ReduceTask向MapTask获取相应分区的数据。

第15步:程序运⾏完毕后,MR会向RM申请注销⾃⼰。

进度和状态更新 YARN中的任务将其进度和状态返回给应⽤管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应⽤管理器请求进度更新, 展示给⽤户。

作业完成

除了向应⽤管理器请求作业进度外, 客户端每5秒都会通过调⽤waitForCompletion()来检查作业是否完成。

时间间隔可以通过mapreduce.client.completion.pollinterval来设置。

作业完成之后, 应⽤管理器和Container会清理⼯作状态。作业的信息会被作业历史服务器存储以备之后⽤户核查。

第 3 节 Yarn调度策略

Hadoop作业调度器主要有三种:FIFOCapacity SchedulerFair Scheduler

Hadoop2.9.2默认的资源调度器是Capacity Scheduler

可以查看yarn-default.xml

1. FIFO(先进先出调度器)


2. 容量调度器(Capacity Scheduler 默认的调度器)

Apache Hadoop默认使⽤的调度策略。Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的⼀部分计算能⼒。通过为每个组织分配专⻔的队列,然后再为每个队列分配⼀定的集群资源,这样整个集群就可以通过设置多个队列的⽅式给多个组织提供服务了。除此之外,队列内部⼜可以垂直划分,这样⼀个组织内部的多个成员就可以共享这个队列资源了,在⼀个队列内部,资源的调度是采⽤的是先进先出(FIFO)策略。


3. Fair Scheduler(公平调度器,CDH版本的hadoop默认使⽤的调度器)

Fair调度器的设计⽬标是为所有的应⽤分配公平的资源(对公平的定义可以通过参数来设置)。公平调度在也可以在多个队列间⼯作。

举个例⼦,假设有两个⽤户A和B,他们分别拥有⼀个队列。
当A启动⼀个job⽽B没有任务时,A会获得全部集群资源;当B启动⼀个job后,A的job会继续运⾏,不过⼀会⼉之后两个任务会各⾃获得⼀半的集群资源。如果此时B再启动第⼆个job并且其它job还在运⾏,则它将会和B的第⼀个job共享B这个队列的资源,也就是B的两个job会⽤于四分之⼀的集群资源,⽽A的job仍然⽤于集群⼀半的资源,结果就是资源最终在两个⽤户之间平等的共享

第 4 节 Yarn多租户资源隔离配置

Yarn集群资源设置为A,B两个队列,
A队列设置占⽤资源70%主要⽤来运⾏常规的定时任务,
B队列设置占⽤资源30%主要运⾏临时任务,
两个队列间可相互资源共享,假如A队列资源占满,B队列资源⽐较充裕,A队列可以使⽤B队列的资源,使总体做到资源利⽤最⼤化

选择使⽤Fair Scheduler调度策略!!

具体配置

1. yarn-site.xml

<!-- 指定任务调度使⽤fairScheduler的调度⽅式 -->
<property>
     <name>yarn.resourcemanager.scheduler.class</name>
     <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
     <description>In case you do not want to use the default scheduler</description>
</property>

2. 创建fair-scheduler.xml⽂件
在Hadoop安装⽬录/etc/hadoop创建该⽂件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<allocations>
      <defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
      <queue name="root" >
          <queue name="default">
              <aclAdministerApps>*</aclAdministerApps>
              <aclSubmitApps>*</aclSubmitApps>
              <maxResources>9216 mb,4 vcores</maxResources>
              <maxRunningApps>100</maxRunningApps>
              <minResources>1024 mb,1vcores</minResources>
              <minSharePreemptionTimeout>1000</minSharePreemptionTimeout>
              <schedulingPolicy>fair</schedulingPolicy>
              <weight>7</weight>
          </queue>
          <queue name="queue1">
              <aclAdministerApps>*</aclAdministerApps>
              <aclSubmitApps>*</aclSubmitApps>
              <maxResources>4096 mb,4vcores</maxResources>
              <maxRunningApps>5</maxRunningApps>
              <minResources>1024 mb, 1vcores</minResources>
              <minSharePreemptionTimeout>1000</minSharePreemptionTimeout>
              <schedulingPolicy>fair</schedulingPolicy>
              <weight>3</weight>
          </queue>
      </queue> 
      <queuePlacementPolicy>
         <rule create="false" name="specified"/>
          <rule create="true" name="default"/>
      </queuePlacementPolicy>
</allocations>

界⾯验证

第⼋部分 Apache Hadoop HDFS核⼼源码剖析

第 1 节 源码阅读准备

1. 下载Apache Hadoop-2.9.2官⽅源码
2. 将源码导⼊idea中

启动idea在提示界⾯选择导⼊

等待下载和解决依赖完成,源码导⼊成功!!

第 2 节 NameNode 启动流程

命令启动Hdfs集群

start-dfs.sh


该命令会启动Hdfs的NameNode以及DataNode,启动NameNode主要是通过
org.apache.hadoop.hdfs.server.namenode.NameNode类。

我们重点关注NameNode在启动过程中做了哪些⼯作(偏离主线的技术细节不深究)

对于分析启动流程主要关注两部分代码:

namenode的主要责任是⽂件元信息与数据块映射的管理。相应的,namenode的启动流程需要关注与客户端、datanode通信的⼯作线程,⽂件元信息的管理机制,数据块的管理机制等。其中,RpcServer主要负责与客户端、datanode通信,FSDirectory主要负责管理⽂件元信息。

第 3 节 DataNode 启动流程

datanode的Main Class是DataNode,先找到DataNode.main()

第 4 节 写数据流程

datanode上有很多重要的⼯作线程。其中,与写数据块过程联系最紧密的是DataXceiverServer与BPServiceActor。客户端与数据节点间主要通过流接⼝DataTransferProtocol完成数据块的读/写。

DataTransferProtocol⽤于整个管道中的客户端、数据节点间的流式通信,其中,DataTransferProtocol--writeBlock()负责完成写数据块的⼯作:

第 5 节 NameNode如何⽀撑⾼并发访问(双缓冲机制)

⾼并发访问NameNode会遇到什么样的问题:

经过学习HDFS的元数据管理机制,Client每次请求NameNode修改⼀条元数据

(⽐如说申请上传⼀个⽂件,都要写⼀条edits log,包括两个步骤:

写⼊本地磁盘--edits⽂件

通过⽹络传输给JournalNodes集群(Hadoop HA集群--结合zookeeper来学习)。


⾼并发的难点主要在于数据的多线程安全以及每个操作效率!!

对于多线程安全:

NameNode在写edits log时⼏个原则:

写⼊数据到edits_log必须保证每条edits都有⼀个全局顺序递增的transactionId(简称为txid),这样才可以标识出来⼀条⼀条的edits的先后顺序。

如果要保证每条edits的txid都是递增的,就必须得加同步锁。也就是每个线程修改了元数据,要写⼀条edits 的时候,都必须按顺序排队获取锁后,才能⽣成⼀个递增的txid,代表这次要写的edits的序号。

产⽣的问题:
如果每次都是在⼀个加锁的代码块⾥,⽣成txid,然后写磁盘⽂件edits log,这种既有同步锁⼜有写磁盘操作⾮常耗时!!

HDFS优化解决⽅案
问题产⽣的原因主要是在于,写edits时串⾏化排队⽣成⾃增txid + 写磁盘操作费时,

HDFS的解决⽅案
1. 串⾏化:使⽤分段锁
2. 写磁盘:使⽤双缓冲

分段加锁机制  ⾸先各个线程依次第⼀次获取锁,⽣成顺序递增的txid,然后将edits写⼊内存双缓冲的区域1,接着就⽴⻢第⼀次释放锁了。趁着这个空隙,后⾯的线程就可以再次⽴⻢第⼀次获取锁,然后⽴即写⾃⼰的edits到内存缓冲。

双缓冲机制  程序中将会开辟两份⼀模⼀样的内存空间,⼀个为bufCurrent,产⽣的数据会直接写⼊到这个bufCurrent,⽽另⼀个叫bufReady,在bufCurrent数据写⼊(达到⼀定标准)后,两⽚内存就会exchange(交换)。直接交换双缓冲的区域1和区域2。保证接收客户端写⼊数据请求的都是操作内存,  ⽽不是同步写磁盘。

双缓冲源码分析

扩展 Hadoop 3.x 新特性概述

Hadoop3.x中增强了很多特性,在Hadoop3.x中,不再允许使⽤jdk1.7,要求jdk1.8以上版本。这是因为Hadoop 2.0是基于JDK 1.7开发的,⽽JDK 1.7在2015年4⽉已停⽌更新,这直接迫使Hadoop社区基于JDK 1.8重新发布⼀个新的Hadoop版本,⽽这正是Hadoop3.x。Hadoop3.x以后将会调整⽅案架构,将Mapreduce 基于内存+io+磁盘,共同处理数据。

Hadoop 3.x中引⼊了⼀些重要的功能和优化,包括HDFS 可擦除编码、多Namenode⽀持、MR NativeTask优化、YARN基于cgroup的内存和磁盘IO隔离、YARN container resizing等。

Hadoop3.x官⽅⽂档地址如下:

http://hadoop.apache.org/docs/r3.0.1/

 Hadoop3.x新特性之Common改进

Hadoop Common改进:

1. 精简Hadoop内核,包括剔除过期的API和实现,将默认组件实现替换成最⾼效的实现(⽐如将FileOutputCommitter缺省实现换为v2版本,废除hftp转由webhdfs替代,移除Hadoop⼦实现序列化库org.apache.hadoop.Records

2. lasspath isolation以防⽌不同版本jar包冲突,⽐如google Guava在混合使⽤Hadoop、HBase和Spark时,很容易产⽣冲突.(https://issues.apache.org/jira/browse/HADOOP-11656)

3. Shell脚本重构。 Hadoop 3.0对Hadoop的管理脚本进⾏了重构,修复了⼤量bug,增加了新特性,⽀持动态命令等。使⽤⽅式上则和之前版本的⼀致。(https://issues.apache.org/jira/browse/HADOOP-9902)

Hadoop3.x新特性之HDFS改进

Hadoop3.x中最⼤改变的是HDFS,HDFS通过最近black块计算,根据最近计算原则,本地black块,加⼊到内存,先计算,通过IO,共享内存计算区域,最后快速形成计算结果。

1. HDFS⽀持数据的擦除编码,这使得HDFS在不降低可靠性的前提下,节省⼀半存储空间。(https://issues.apache.org/jira/browse/HDFS-7285)

2. 多NameNode⽀持,即⽀持⼀个集群中,⼀个active、多个standby namenode部署⽅式。注:多ResourceManager特性在hadoop 2.0中已经⽀持。(https://issues.apache.org/jira/browse/HDFS-6440)

关于这两个特性的官⽅⽂档地址:

http://hadoop.apache.org/docs/r3.0.1/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html

http://hadoop.apache.org/docs/r3.0.1/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html


 Hadoop3.x新特性之YARN改进

1. 基于cgroup的内存隔离和IO Disk隔离(https://issues.apache.org/jira/browse/YARN-2619)

2. ⽤curator实现RM leader选举(https://issues.apache.org/jira/browse/YARN-4438)

3. containerresizing(https://issues.apache.org/jira/browse/YARN-1197)

4. Timelineserver next generation (https://issues.apache.org/jira/browse/YARN-2928)

官⽅⽂档地址:

http://hadoop.apache.org/docs/r3.0.1/hadoop-yarn/hadoop-yarn-site/TimelineServiceV2.html


Hadoop3.x新特性之MapReduce改进

1. Tasknative优化。为MapReduce增加了C/C++的map output collector实现(包括Spill,Sort和IFile等),通过作业级别参数调整就可切换到该实现上。对于shuffle密集型应⽤,其性能可提⾼约30%。(https://issues.apache.org/jira/browse/MAPREDUCE-2841)

2. MapReduce内存参数⾃动推断。在Hadoop 2.0中,为MapReduce作业设置内存参数⾮常繁琐,涉及到两个参数:mapreduce.{map,reduce}.memory.mb和mapreduce.{map,reduce}.java.opts,⼀旦设置不合理,则会使得内存资源浪费严重,⽐如将前者设置为4096MB,但后者却是“-Xmx2g”,则剩余2g实际上⽆法让java heap使⽤到。(https://issues.apache.org/jira/browse/MAPREDUCE-5785)

Hadoop3.x新特性之其他

1. 添加新的 hadoop-client-api 和 hadoop-client-runtime 组件到⼀个单ᇿ的jar包⾥,以此解决依赖不兼容的问题.(https://issues.apache.org/jira/browse/HADOOP-11804)
2. ⽀持微软的Azure分布式⽂件系统和阿⾥的aliyun分布式⽂件系统

猜你喜欢

转载自blog.csdn.net/chengh1993/article/details/111771134