part1.
slsl测试时的语句
echo "!!!!!!!into autoSubmitJobs.sh"
dir=/usr/local/hadoop/share/hadoop/tools/sls
rm -rf $dir/my-logs
mkdir $dir/my-logs
rm -rf /usr/local/hadoop/share/hadoop/tools/sls/yumh-err.txt
bin/slsrun.sh --input-sls=$dir/my-input/sls-jobs.json --nodes=$dir/my-input/sls-nodes.json --output-dir=$dir/my-logs/ --track-jobs=job1_Siyi,job2_Siyi,job3_Siyi --print-simulation
--input-rumen: 输入是rumen trace文件,示例为/share/hadoop/tools/sls/sample-data/2jobs2min-rumen-jh.json.
--input-sls: 输入是sls自己的格式文件,sls file。sls提供了一个工具来将rumen traces文件转换为sls trace:rumen2sls.sh(/share/hadoop/tools/sls/bin/)。关于SLS输入JSON文件的示例,见最后。
--output-dir: 输出监控数据和日志的目录
--nodes: 集群的拓扑结构,默认情况下,sls采用input json file中的拓扑,用户也可以指定一个新的拓扑结构。
--track-jobs: 在模拟器运行过程中跟踪的特定任务,由逗号分隔。
--print-simulation: 该参数决定了是否在模拟器运行前打印仿真信息,包括每个应用程序的节点、应用程序、任务和信息的数量。如果需要,只需要添加上该参数即可。
参考原文:https://blog.csdn.net/hahachenchen789/article/details/80748920
part2
slsrunner,Java源码流程:(如果想看完整的:https://blog.csdn.net/hahachenchen789/article/details/81050621)
首先添加option(string opt,string longOpt,boolean hasArg,string description)
选项名,选项全称,是否有参数,描述
添加好后,传入参数,start。
start方法中,依次开启rm,nm,am,所有node正常运行之后,开启runner。
startRM:
通过YarnConfiguration获得yarn-site.xml中参数,从中得到schedule方案(fifo,capacity或者fair,默认fair)
然后通过RM自身的init和start开启RM。
startNM:
nodeResourceMap = SLSUtils.parseNodesFromNodeFile从--nodes参数获得的nodes机架配置文件nodeFile和nodeManagerResource作为参数,获得Node的所有参数。在此之前,SLSrunner中的init从sls-runner.xml中获得每个Node的mem和cpu信息。
startAM:
选择输入的格式会有对应的函数,这里看下sls:startAMFromSLSTrace
通过while循环,每一个job会调用createAMForJob函数。
从sls-jobs.json中获得jobStartTime,jobFinishTime。user,queue,amType等信息。
然后调用runNewAM函数开启AM,将上面的参数信息传递过去。
将sls-jobs.json中某个具体jobs下的task任务以container的形式分配出来,有多少个task,list就有多大。
然后将tasks一一取出,通过for循环来为每一个分配container。
在循环中,先是获得task的信息,比如start,end 时间,优先级,task类型(map)。然后将这些信息收集起来,传递给getResourceForContainer函数,来申请container。
循环最后,将申请的资源res加入到待分配container list中。
by: https://blog.csdn.net/hahachenchen789/article/details/81050621
在yarn-site.xml中修改默认的schedule
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<!-- <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>-->
<!-- <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler</value> -->
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
对于容量调度器,可以通过设置yarn.scheduler.capacity.node-locality-delay来配置延迟调度。设置为正整数,表示调度器在放松节点限制、改为匹配同一机架上的其他节点前,准备错过的调度机会的数量。
fair-schedule内的权重那些参数好像是可以随时改变随时生效的:(偶然发现在改变xml时一保存allocated memory就马上发生了变化)
capacity-schedule不能随时改。。。这个继续实验下看看
<property>
<name>yarn.scheduler.capacity.node-locality-delay</name>
<value>40</value>
<description>
Number of missed scheduling opportunities after which the CapacityScheduler
attempts to schedule rack-local containers.
Typically this should be set to number of nodes in the cluster, By default is setting
approximately number of nodes in one rack which is 40.
</description>
</property>
fair-schedule中的配置:
经过测试发现weight的数值*最小资源的值就是最大的分配的值???
(如果有问题请务必留言,多谢)
<queue name="queueA">
<weight>5</weight>
<minResources>1024 mb,1 vcores</minResources>
<schedulingPolicy>fifo</schedulingPolicy>
</queue>
<queue name="queueB">
<weight>5</weight>
<schedulingPolicy>fifo</schedulingPolicy>
</queue>
capacity-schedule:
经测试发现后面的max为100的时候才会把资源全部分配出去,如果都是50的话则会一半。
<property>
<name>yarn.scheduler.capacity.root.queueA.capacity</name>
<value>50</value>
<description>Default queue target capacity.</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.queueB.capacity</name>
<value>50</value>c
<description>Default queue target capacity.</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.queueA.maximum-capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queueB.maximum-capacity</name>
<value>100</value>
</property>
这是都是50的时候。。。好像又不是分配了50%。。。不太清楚,以后知道了回来改ovo
yarn三种调度器解析: