YARN调度程序是一个有趣的领域,具有不同的实现方式,例如Fifo,Capacity和Fair调度程序。同时,还进行了一些优化,以提高针对不同场景和工作负载的调度程序性能。每个调度程序算法都有其自己的功能集,并根据公平性,容量保证,资源可用性等许多因素来驱动调度决策。在部署到生产集群中之前,对调度程序算法进行很好的评估非常重要。不幸的是,目前评估调度程序算法并非易事。在真实的集群中进行评估总是很费时间和成本,而且很难找到足够大的集群。因此,可以预测某个特定工作负载的调度程序算法的仿真器非常有用。
YARN Scheduler Load Simulator(SLS)就是这样的工具,它可以在一台机器上模拟大规模YARN集群和应用程序负载,该模拟器通过为研究人员和开发人员提供工具来原型化新的Scheduler功能,对于进一步推广YARN具有非常重要的价值。并以合理的信心预测其行为和性能,从而帮助快速创新。o模拟器将通过处理和调度NM / AM来模拟NodeManager和ApplicationMaster,从而行使真正的YARN ResourceManager来消除网络因素来自同一JVM的心跳事件。为了跟踪调度程序的行为和性能,调度程序包装器将包装实际的调度程序。
可以从配置文件中加载集群的大小和应用程序负载,这些配置文件是通过采用Apache Rumen直接从作业历史文件中生成的。
该模拟器将在执行时生成实时指标,包括:
整个集群和每个队列的资源使用情况,可用于配置集群和队列的容量。
详细的应用程序执行跟踪(与模拟时间有关的记录),可以对其进行分析以了解/验证调度程序的行为(单个作业的时间,吞吐量,公平性,容量保证等)。
调度程序算法的几个关键指标,例如每个调度程序操作的时间成本(分配,处理等),Hadoop开发人员可以利用这些指标来查找代码点和可伸缩性限制。
本节将显示如何使用模拟器。这里让$ HADOOP_ROOT代表Hadoop安装目录。如果您自己构建Hadoop,则$ HADOOP_ROOT是hadoop-dist / target / hadoop- $ VERSION。该模拟器位于$ HADOOP_ROOT / share / hadoop / tools / sls。fold sls容器包含四个目录:bin,html,sample-conf和sample-data
bin:包含模拟器的运行脚本。
html:用户还可以在离线模式下重现这些实时跟踪图。只需将realtimetrack.json上传到$ HADOOP_ROOT / share / hadoop / tools / sls / html / showSimulationTrace.html即可。对于浏览器安全问题,需要将文件realtimetrack.json和showSimulationTrace.html放在同一目录中。
sample-conf:指定模拟器配置。
sample-data:提供示例瘤胃跟踪,可用于生成模拟器的输入。
以下各节将逐步介绍如何使用模拟器。在开始之前,请确保$ PATH环境参数中包含了hadoop命令。
在开始之前,请确保Hadoop和模拟器配置正确。Hadoop和模拟器的所有配置文件都应放在$ HADOOP_ROOT / etc / hadoop目录中,ResourceManager和YARN调度程序将在其中加载其配置。目录$ HADOOP_ROOT / share / hadoop / tools / sls / sample-conf /提供了一些示例配置,可用于启动演示。
有关Hadoop和YARN调度程序的配置,用户可以访问Yarn的网站(http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/)。
对于模拟器,它从文件$ HADOOP_ROOT / etc / hadoop / sls-runner.xml加载配置信息。
在这里,我们说明sls-runner.xml中的每个配置参数。请注意,$ HADOOP_ROOT / share / hadoop / tools / sls / sample-conf / sls-runner.xml包含这些配置参数的所有默认值。
yarn.sls.runner.pool.size
该模拟器使用线程池来模拟NM和AM运行,并且此参数指定池中的线程数。
yarn.sls.nm.memory.mb
每个NMSimulator的总内存。
yarn.sls.nm.vcores
每个NMSimulator的总vCore。
yarn.sls.nm.heartbeat.interval.ms
每个NMSimulator的心跳间隔。
yarn.sls.am.heartbeat.interval.ms
每个AMSimulator的心跳间隔。
yarn.sls.am.type.mapreduce
适用于类似MapReduce的应用程序的AMSimulator实现。用户可以为其他类型的应用程序指定实现。
yarn.sls.container.memory.mb
每个容器模拟器所需的内存。
yarn.sls.container.vcores
每个容器模拟器所需的vCore。
yarn.sls.runner.metrics.switch
该模拟器引入了度量标准,用于度量关键组件和操作的行为。此字段指定我们是打开(ON)还是关闭(OFF)运行的指标。
yarn.sls.metrics.web.address.port
模拟器用于提供实时跟踪的端口。默认值为10001。
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler
Fifo Scheduler的调度程序指标的实现。
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
公平调度程序的调度程序指标的实现。
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
Capacity Scheduler的调度程序度量标准的实现。
模拟器支持两种类型的输入文件:瘤胃轨迹和它自己的输入轨迹。启动模拟器的脚本是slsrun.sh。
$ cd $ HADOOP_ROOT / share / hadoop / tools / sls $ bin / slsrun.sh 用法:slsrun.sh <OPTIONS> --tracetype = <合成| SLS | 瘤胃> --tracelocation = <文件1,文件2,...> (不建议使用--input-rumen = <FILE1,FILE2,...> | --input-sls = <FILE1,FILE2,...>) --output-dir = <SLS_SIMULATION_OUTPUT_DIRECTORY> [--nodes = <SLS_NODES_FILE>] [--track-jobs = <JOBID1,JOBID2,...>] [-打印模拟]
--input-rumen:输入瘤胃跟踪文件。用户可以输入多个文件,以逗号分隔。$ HADOOP_ROOT / share / hadoop / tools / sls / sample-data / 2jobs2min-rumen-jh.json中提供了一个示例跟踪。这等效于--tracetype = RUMEN --tracelocation = <path_to_trace>。
--input-sls:模拟器自己的文件格式。该模拟器还提供了将瘤胃跟踪转换为sls跟踪的工具(rumen2sls.sh)。有关sls输入json文件的示例,请参阅附录。这等效于--tracetype = SLS --tracelocation = <path_to_trace>。
--tracetype:这是配置跟踪生成并采用值RUMEN,SLS或SYNTH的新方法,以触发三种类型的负载生成
--tracelocation:输入文件的路径,与上面的跟踪类型匹配。
--output-dir:生成的运行日志和指标的输出目录。
--nodes:集群拓扑。默认情况下,模拟器将使用从输入json文件获取的拓扑。用户可以通过设置此参数来指定新的拓扑。有关拓扑文件格式,请参阅附录。
--track-jobs:模拟器运行期间将跟踪的特定作业,以逗号分隔。
--print-simulation:是否在模拟器运行前是否打印出模拟信息,包括节点数,应用程序,任务以及每个应用程序的信息。
与瘤胃格式相比,此处的sls格式要简单得多,并且用户可以轻松生成各种工作负载。该模拟器还提供了将瘤胃痕迹转换为sls痕迹的工具。
$ bin / rumen2sls.sh --rumen-file = <RUMEN_FILE> --output-dir = <SLS_OUTPUT_DIRECTORY> [--output-prefix = <SLS_FILE_PREFIX>]
--rumen-file:瘤胃格式文件。目录sample-data中提供了一个示例跟踪。
--output-dir:生成的模拟跟踪的输出目录。将在此输出目录中生成两个文件,其中一个跟踪文件包含所有作业和任务信息,另一个文件显示拓扑信息。
--output-prefix:所生成文件的前缀。默认值为“ sls”,并且生成的两个文件为sls-jobs.json和sls-nodes.json。
YARN Scheduler Load Simulator集成了度量标准,用于衡量关键组件和操作的行为,包括正在运行的应用程序和容器,集群可用资源,调度程序的操作时间成本等。如果开关yarn.sls.runner.metrics.switch设置为ON,则度量标准将运行并输出到用户指定的--output-dir目录中。用户可以在模拟器运行期间跟踪这些信息,也可以在运行后分析这些日志以评估调度程序的性能。
该模拟器提供了一个界面,用于实时跟踪其运行情况。用户可以转到http:// host:port / simulate跟踪整个运行情况,并转到http:// host:port / track跟踪特定的作业或队列。在这里,主机是运行模拟器的地方,而port是yarn.sls.metrics.web.address.port配置的值(默认值为10001)。
在这里,我们将说明网页中显示的每个图表。
第一个数字描述了正在运行的应用程序和容器的数量。
第二个图描述了集群中已分配和可用的资源(内存)。
第三张图描述了为每个队列分配的资源。这里我们有3个队列:sls_queue_1,sls_queue_2和sls_queue_3。前两个队列配置为25%的份额,最后一个队列配置为50%的份额。
第四个数字描述了每个调度程序操作的时间成本。
最后,我们测量模拟器使用的内存。
该模拟器还提供了用于跟踪某些特定作业和队列的界面。转到http:// <Host>:<Port> / track以获取这些信息。
在这里,第一幅图说明了队列SLS_Queue_1的资源使用信息。
第二个图说明了作业job_1369942127770_0653的资源使用信息。
模拟器完成后,所有日志将被保存在由指定的输出目录--output-DIR在$ HADOOP_ROOT /股/的Hadoop /工具/ SLS /斌/ slsrun.sh。
文件realtimetrack.json:每1秒记录一次所有实时跟踪日志。
文件jobruntime.csv:在模拟器中记录所有作业的开始和结束时间。
文件夹指标:指标生成的日志。
用户还可以在离线模式下重现这些实时跟踪图。只需将realtimetrack.json上传到$ HADOOP_ROOT / share / hadoop / tools / sls / html / showSimulationTrace.html即可。对于浏览器安全问题,需要将文件realtimetrack.json和showSimulationTrace.html放在同一目录中。
合成负载生成器通过提供分布式驱动的负载生成,补充了SLS本地和RUMEN轨迹的广泛特性。负载生成器组织为JobStoryProducer(与瘤胃兼容,并因此与Gridmix兼容,以便以后集成)。我们为随机数生成器设定种子,以便结果是随机的但可确定的,因此可重复。我们组织围绕/ workloads / job_class生成的作业层次结构,可以轻松地将具有类似行为的作业分组并对其进行分类(例如,具有长时间运行的容器的作业或仅map的计算等)。用户可以控制许多重要参数的平均值和标准差,例如,映射器/缩减器的数量,映射器/缩减器的持续时间,容器的大小(内存/ cpu),保留的机会等。我们使用加权随机抽样(无论何时从少量选项中进行选择)或LogNormal分布(以避免出现负值),当我们从较大范围的值中进行选择时-请参阅LogNormal分布的附录。
SLS的SYNTH模式非常方便,可以生成非常大的负载,而无需大量的输入文件。这样可以轻松有效地探索各种用例(例如,设想模拟10万个作业,并在不同的运行中简单地调整映射器的平均数量或平均任务持续时间)。
这与为实际集群配置资源类型相同。如以下示例所示,在yarn-site.xml中配置项yarn.resource-types。
<属性> <name> yarn.resource-types </ name> <value> resource-type1,resource-type2 </ value> </ property>
像下面的示例一样,通过将相关项添加到sls-runner.xml中来指定每个节点中的资源大小。该值适用于SLS中的每个节点。内存和vcore以外的资源的默认值为0。
<属性> <name> yarn.sls.nm.resource-type1 </ name> <value> 10 </ value> </ property> <属性> <name> yarn.sls.nm.resource-type2 </ name> <value> 10 </ value> </ property>
SLS JSON输入格式支持资源类型,但其他两种格式(SYNTH和RUMEN)不支持。要使其以SLS JSON输入格式工作,可以为任务容器和AM容器指定资源大小。这是一个例子。
{ “ job.start.ms”:0, “ am.memory-mb”:2048, “ am.vcores”:2 “ am.resource-type1”:2 “ am.resource-type2”:2 “ job.tasks”:[{ “ container.duration.ms”:5000 “ container.memory-mb”:1024, “ container.vcores”:1, “ container.resource-type1”:1, “ container.resource-type2”:1 } }
在这里,我们提供sls json文件的示例格式,其中包含2个作业。第一个作业有3个地图任务,第二个作业有2个地图任务。
{ “ num.nodes”:3,//集群中的节点总数 “ num.racks”:1 //集群中的机架总数,它将num.nodes均匀地划分为多个机架,可选,默认值为1 } { “ am.type”:“ mapreduce”,// AM类型,可选,默认值为“ mapreduce” “ job.start.ms”:0,//作业开始时间 “ job.end.ms”:95375,//作业完成时间,可选,默认值为0 “ job.queue.name”:“ sls_queue_1”,//队列作业将被提交到 “ job.id”:“ job_1”,//用于跟踪作业的作业ID,可选。如果未指定默认值或job.count> 1,则使用默认值,即从零开始的从零开始的整数。 “ job.user”:“默认”,//用户,可选,默认值为“ default” “ job.count”:1,//作业数,可选,默认值为1 “ job.tasks”:[{ “ count”:1,//任务数,可选,默认值为1 “ container.host”:“ / default-rack / node1”,//容器请求的主机 “ container.start.ms”:6664,//容器开始时间,可选 “ container.end.ms”:23707,//容器完成时间,可选 “ container.duration.ms”:50000,//容器的持续时间,如果指定了开始和结束时间,则为可选 “ container.priority”:20,//容器的优先级,可选,默认值为20 “ container.type”:“ map” //容器的类型,可以是“ map”或“ reduce”,可选,默认值为“ map” },{ “ container.host”:“ / default-rack / node3”, “ container.start.ms”:6665, “ container.end.ms”:21593, “ container.priority”:20, “ container.type”:“地图” },{ “ container.host”:“ / default-rack / node2”, “ container.start.ms”:68770, “ container.end.ms”:86613, “ container.priority”:20, “ container.type”:“地图” }] } { “ am.type”:“ mapreduce”, “ job.start.ms”:105204, “ job.end.ms”:197256, “ job.queue.name”:“ sls_queue_2”, “ job.id”:“ job_2”, “ job.user”:“默认”, “ job.tasks”:[{ “ container.host”:“ / default-rack / node1”, “ container.start.ms”:111822, “ container.end.ms”:133985, “ container.priority”:20, “ container.type”:“地图” },{ “ container.host”:“ / default-rack / node2”, “ container.start.ms”:111788, “ container.end.ms”:131377, “ container.priority”:20, “ container.type”:“地图” }] }
在这里,我们提供了合成生成器json文件的示例格式。我们使用(json-非一致性)内联注释来解释每个参数的用法。
{ “ description”:“微小的工作量”,//此工作量集合含义的描述 “ num_nodes”:10,//模拟集群中的总节点 “ nodes_per_rack”:4,//每个模拟机架中的节点数 “ num_jobs”:10,//正在模拟的作业总数 “ rand_seed”:2,//用于确定性随机运行的随机种子 //“工作量”列表,每个工作量都有工作类别和时间属性 “工作量”:[ { “ workload_name”:“ tiny-test”,//工作负载的名称 “ workload_weight”:0.5,//用于加权随机选择要从中采样的工作负载 “ queue_name”:“ sls_queue_1”,//将作业提交到队列 //此工作负载的不同类别的工作 “ job_classes”:[ { “ class_name”:“ class_1”,//类的名称 “ class_weight”:1.0,//用于在工作负载内对类别进行加权随机选择 // nextr组控制对数正态分布的平均值和标准偏差 //确定作业的映射器和化简器的数量。 “ mtasks_avg”:5 “ mtasks_stddev”:1 “ rtasks_avg”:5 “ rtasks_stddev”:1 // LogNormal分布的平均和stdev输入参数控制作业持续时间 “ dur_avg”:60, “ dur_stddev”:5 // LogNormal分布的平均和stdev输入参数控制映射器和减速器的持续时间 “ mtime_avg”:10, “ mtime_stddev”:2 “ rtime_avg”:20, “ rtime_stddev”:4 // LogNormal分布的averge和stdev输入参数控制映射的内存和内核以及reduce “ map_max_memory_avg”:1024, “ map_max_memory_stddev”:0.001, “ reduce_max_memory_avg”:2048, “ reduce_max_memory_stddev”:0.001, “ map_max_vcores_avg”:1 “ map_max_vcores_stddev”:0.001, “ reduce_max_vcores_avg”:2 “ reduce_max_vcores_stddev”:0.001, //保留运行此作业的可能性 “ chance_of_reservation”:0.5, // LogNormal分布的输入参数,它确定截止期限的松弛(作为工作持续时间的乘数) “ deadline_factor_avg”:10.0, “ deadline_factor_stddev”:0.001, } ], //对于每个工作负载,确定每次选择存储桶以选择作业开始时间的概率。 //在下面的示例中,作业在第一分钟启动的机会是第二分钟的两倍 //模拟,然后零机会。 “ time_distribution”:[ {“ time”:1,“ weight”:66}, {“ time”:60,“ weight”:33}, {“ time”:120,“ jobs”:0} ] } ] }