Yarn调度器配置
理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。在Yarn中,负责给应用分配资源的就是Scheduler。其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景。
在Yarn框架中,调度器是一块很重要的内容。有了合适的调度规则,就可以保证多个应用可以在同一时间有条不紊的工作。最原始的调度规则就是FIFO,即按照用户提交任务的时间来决定哪个任务先执行,但是这样很可能一个大任务独占资源,其他的资源需要不断的等待。也可能一堆小任务占用资源,大任务一直无法得到适当的资源,造成饥饿。
为了解决以上问题,yarn提供了两种调度器,分别为:容量调度器和公平调度器。
容量调度器
原理
针对多用户调度,容量调度器采用的方法稍有不同。集群由很多队列组成,这些队列可能是层次结构的(因此,一个队列可能是另一个队列的子队列),每个队列被分配有一定的容量。本质上,容量调度器允许用户或组织为每个用户或组织模拟出一个使用FIFO调度策略的独立集群。容量调度器说的通俗点,可以理解成一个个的资源队列。这个资源队列是用户自己去分配的。
配置文件改动
1、调度器所占的最大份额设置为0.5。如果分配的过小,一个任务大概3G的内存,am会一直在等待过程中,无法进行下去。
2、root的队列是default,default的容量是100%,所有的任务都在同一个队列里面。
容量调度器演示
1、将default队列的情况打印出来。
命令:yarn queue -status default
注:包括状态、容量、当前的容量、最大的容量
公平调度器
原理
公平调度器的目标是让每个用户公平共享集群能力。如果只有一个作业在运行,就会得到集群的所有资源。随着提交的作业越来越多,闲置的任务就会以“让每个用户公平共享集群”这种方式进行分配。某个用户的耗时短的作业将在合理的时间内完成,即便另一个用户的长时间作业正在运行而且还在运行过程中。
将整个集群资源都分配给应用程序,当提交其他应用程序的时候,已经释放的资源分配给新的应用程序。因此,每个应用程序最后都能粗略的获得等量的资源。
代码解释
Client向Resource Manager申请资源运行ApplicationMaster,ApplicationMaster向Node Manager申请资源也就是container,这里我们申请了10个container,去运行javaPi程序。
Client.java
1、创建Yarn的Client端,启动Yarn的Client端。
2、用YarnClient创建Application,得到application的上下文。注意,在Yarn中不允许提交相同名字的应用程序。
3、设置am的资源申请量,1G和一核。
4、设置application的环境变量。
ApplicationMaster.java
1、创建AMRMClient端,Application Master要向Resource Manager申请资源。
2、创建nmClient端,是向Node Manager交互的客户端。
3、向RM注册心跳信息。
4、申请container。
Yarn编程实战
下载程序
1、在app-11上,确保集群是启动的。
命令:jps
2、切换到tmp目录下。
命令:cd /tmp
3、创建yarn文件。
命令:mkdir yarn
4、进入程序所在的文件夹下。
命令:cd Spark-stack/yarnExample/src/main/
5、将Java文件拷贝到新建的yarn文件夹下。
命令:cp -r java/* /tmp/yarn/
6、进入yarn目录下。
命令:cd /tmp/yarn/
编译程序
7、确定tools.jar存在。
命令:export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
8、使用hadoop命令编译程序。
命令:hadoop com.sun.tools.javac.Main org/apache/hadoop/yarn/examples/*.java
注:程序文件在examples目录下,编译.java文件。
9、查看examples目录下。
命令:ls org/apache/hadoop/yarn/examples/
注:会出现许多的class文件。
10、将class文件打包。
命令:jar cf app.jar org/apache/hadoop/yarn/examples/*.class
打开程序应用状态监视
11、new terminal,之后使用hadoop用户登录。
命令:su – hadoop
12、监视。
命令:yarn top
运行程序
13、返回之前的new terminal,使用hadoop命令提交程序。
命令:hadoop jar app.jar org.apache.hadoop.yarn.examples.Client
注:程序会一直运行下去,一直获取appID的情况。
Top的监视结果。
14、按Ctrl+c停止程序。
查看打印
15、新建new terminal,hadoop用户登录。
命令:su – hadoop
16、javaPi打印,先进入hadoop-3.1.2/logs目录下。
命令:cd /hadoop/Hadoop/hadoop-3.1.2/logs/
17、在进入userlogs目录下。
命令:cd /hadoop/Hadoop/hadoop-3.1.2/logs/userlogs/
注:这里有所有的执行container任务。
18、进入application_1602472376409_0001目录下。
命令:cd application_1602472376409_0001/
注:app-11上有两个个container,分别为02和06.
查看其它机器的container
19、在app-12上,hadoop用户登录。
命令:su – hadoop
20、进入application_1602472376409_0001目录下。
命令:cd/hadoop/Hadoop/hadoop-3.1.2/logs/userlogs/application_1602472376409_0001/
注:这里的container有三个。
21、在app-13上,hadoop用户登录。
命令:su – hadoop
22、进入application_1602472376409_0001目录下。
命令:cd/hadoop/Hadoop/hadoop-3.1.2/logs/userlogs/application_1602472376409_0001/
注:这里的container有四个。
23、随机查看一个contain的运行结果。
命令:cat container_1602472376409_0001_01_000009/stdout
常见问题
问题解释:在javaPi中有些字符串不识别,这里是注释的中文不识别。 问题解决:将javaPi中的中文解释删除。
详细学习内容可观看Spark快速大数据处理扫一扫~~~或者引擎搜索Spark余海峰