2021SC@SDUSC
本篇我将对hadoop-tools中的YARN Scheduler Load Simulator进行分析
概观
YARN Scheduler Load Simulator是一个很有价值的领域,有不同的实现,例如先进先出、容量和公平调度器。同时,还针对不同的场景和工作负载进行了一些优化,以提高调度器的性能。每个调度器算法都有自己的一组特性,并通过许多因素来驱动调度决策,例如公平性、容量保证、资源可用性等。在我们部署到生产集群之前,非常好地评估调度器算法是非常重要的。不幸的是,目前评估一个调度算法并不容易。在一个真正的集群中进行评估总是耗时耗力的,而且很难找到一个足够大的集群。因此,一个能够预测某个特定工作负载的调度算法有多好的模拟器将非常有用。
YARN Scheduler Load Simulator(SLS)就是这样一个工具,它可以在一台机器上模拟大规模的YARN集群和应用负载。该模拟器为研究人员和开发人员提供了一个工具,使他们能够原型化新的调度器特性,并以合理的置信度预测它们的行为和性能,从而帮助快速创新,这在推进纱方面将是无价的。模拟器将练习真正的YARN Scheduler Load Simulator通过模拟消除网络因素节点管理器和应用程序大师通过处理和调度纳米/航空材料的技术规格(Aerospace Material Specification的缩写)心跳事件来自同一个JVM。为了跟踪调度程序的行为和性能,调度程序包装器将包装真正的调度程序。
集群的大小和应用程序负载可以从配置文件中加载,配置文件是通过采用直接从作业历史文件中生成的 Apache Rumen
模拟器将在执行时产生实时指标,包括:
-
整个集群和每个队列的资源使用情况,可用于配置集群和队列的容量。
-
详细的应用程序执行跟踪(相对于模拟时间记录),可以对其进行分析,以了解/验证调度程序行为(单个作业的周转时间、吞吐量、公平性、容量保证等)。).
-
调度算法的几个关键指标,如每个调度操作的时间成本(分配、处理等)。),Hadoop开发人员可以利用它来找到代码点和可伸缩性限制。
目的:
-
使用真实的作业跟踪在没有真实集群的情况下大规模运行调度程序。
-
能够模拟真实的工作负载。
体系结构:
模拟器接受工作负载跟踪或合成负载分布的输入,并生成集群和应用程序信息。对于每个纳米和微米,模拟器建立一个模拟器来模拟它们的运行。所有的NM/AM模拟器都在一个线程池中运行。模拟器重用了YARN scheduler,并从调度程序中构建了一个包装器。调度器包装器可以跟踪调度器行为并生成几个日志,这些日志是模拟器的输出,可以进一步分析。
用例说明:
-
工程
- 验证负载下调度算法的正确性
- 寻找代码热点/关键路径的廉价/实用方法。
- 验证变更和新功能的影响。
- 确定驱动调度程序可伸缩性限制的因素。
-
质量保证
- 验证“大型”集群和多个工作负载配置文件的调度程序行为。
-
解决方案/销售。
- 预定义/典型工作负载的规模模型。
- 使用真实客户数据(作业跟踪)的集群规模调整工具。
- 确定特定工作负载下的最低服务级别协议。
使用步骤:
1.配置hadoop和模拟器:
在我们开始之前,确保Hadoop和模拟器配置良好。Hadoop和模拟器的所有配置文件都应该放在目录中$HADOOP_ROOT/etc/hadoop,在资源管理器和YARN scheduler加载它们的配置。目录$ HADOOP _ ROOT/share/HADOOP/tools/SLS/sample-conf/提供了几个示例配置,可用于启动演示。
关于Hadoop和YARN scheduler的配置,用户可以参考纱线网站(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包含这些配置参数的所有默认值。
2.运行模拟器:
$ cd $HADOOP_ROOT/share/hadoop/tools/sls
$ bin/slsrun.sh
Usage: slsrun.sh <OPTIONS>
--tracetype=<SYNTH | SLS | RUMEN>
--tracelocation=<FILE1,FILE2,...>
(deprecated --input-rumen=<FILE1,FILE2,...> | --input-sls=<FILE1,FILE2,...>)
--output-dir=<SLS_SIMULATION_OUTPUT_DIRECTORY>
[--nodes=<SLS_NODES_FILE>]
[--track-jobs=<JOBID1,JOBID2,...>]
[--print-simulation]
-
--input-rumen: 用户可以输入多个文件,用逗号分隔One example trace is provided in $HADOOP_ROOT/share/hadoop/tools/sls/sample-data/2jobs2min-rumen-jh.json. This is equivalent to --tracetype=RUMEN --tracelocation=<path_to_trace>.
-
--input-sls: 模拟器有自己的文件格式。. 模拟器提供了一个工具来将 rumen traces 转化为 sls traces (rumen2sls.sh).
-
--tracetype: 这是配置跟踪生成的新方法,取值RUMEN、SLS或SYNTH来触发三种类型的负载生成
-
--tracelocation: 输入文件的路径,与上面的tracetype匹配。
-
--output-dir: 生成的运行日志和指标的输出目录。
-
--nodes: 默认情况下,模拟器将使用从输入json文件中获取的拓扑。用户可以通过设置此参数来指定新拓扑。
-
--track-jobs: 模拟器运行期间将被跟踪的特定作业,用逗号分隔。
-
--print-simulation: 是否在模拟器运行前打印出模拟信息,包括节点数量、应用程序、任务以及每个应用程序的信息。
rumen traces 转化为 sls traces的工具:
$ bin/rumen2sls.sh
--rumen-file=<RUMEN_FILE>
--output-dir=<SLS_OUTPUT_DIRECTORY>
[--output-prefix=<SLS_FILE_PREFIX>]
-
--rumen-file: The rumen 文件格式, 目录中提供了一个示例跟踪样本数据。
-
--output-dir: 生成的模拟轨迹的输出目录。在这个输出目录中将生成两个文件,包括一个包含所有作业和任务信息的跟踪文件,以及另一个显示拓扑信息的文件。
-
--output-prefix: 生成文件的前缀。默认值是“sls”,生成的两个文件是sls-jobs.json和sls-nodes.json。
Metrics:
The YARN Scheduler Load Simulator 集成了Metrics测量关键组件和操作的行为,包括 running applications and containers, cluster available resources, scheduler operation timecost, et al. 如果这个yarn.sls.runner.metrics.switch开关设置为no将运行并输出它登录输出目录用户指定的目录。用户可以在模拟器运行期间跟踪这些信息,也可以在运行后分析这些日志来评估调度程序的性能。
实时跟踪:
模拟器提供了一个实时跟踪其运行的界面。用户可以访问http://host:port/simulate跟踪整个跑步过程,以及http://host:port/track跟踪特定的作业或队列。这是宿主是我们运行模拟器的地方港口是由配置的值yarn. sls.metrics.web.address.port(默认值为10001)。
这里我们将举例说明网页中显示的每个图表。
第一个图描述了正在运行的应用程序和容器的数量。
第二个图描述了集群中已分配和可用的资源(内存)。
第三个图描述了为每个队列分配的资源。这里我们有三个队列:sls_queue_1、sls_queue_2和sls_queue_3。前两个队列配置了25%的份额,而最后一个队列配置了50%的份额。
第四张图描述了每个调度程序操作的时间表。
最后,我们测量模拟器使用的内存。
模拟器还提供了一个界面来跟踪一些特定的作业和队列。去 http://<Host>:<Port>/track来获取这些信息。
这里第一个图说明了队列的资源使用信息SLS_Queue_1。
第二个图说明了作业的资源使用信息job_1369942127770_0653。
模拟器完成后,所有日志都保存在输出目录在$HADOOP_ROOT/share/hadoop/tools/sls/bin/slsrun.sh.
-
File realtimetrack.json:每1秒记录一次所有实时跟踪日志。
-
File jobruntime.csv:在模拟器中记录所有作业的开始和结束时间。
-
Folder metrics:度量生成的日志。
配置资源管理器
这与如何为真实集群配置资源类型相同。配置 yarn.resource-types.资源类型如下例所示。
<property>
<name>yarn.resource-types</name>
<value>resource-type1, resource-type2</value>
</property>
配置节点管理器
通过将相关项添加到sls-runner.xml中来指定每个节点中的资源大小,如下例所示。这些值适用于SLS中的每个节点。除内存和vcores之外的资源的默认值为0。
<property>
<name>yarn.sls.nm.resource-type1</name>
<value>10</value>
</property>
<property>
<name>yarn.sls.nm.resource-type2</name>
<value>10</value>
</property>
在SLS JSON输入中指定资源
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输入文件格式
这里我们提供了一个sls json文件的示例格式,它包含两个作业。第一个作业有3个地图任务,第二个作业有2个地图任务:
{
"num.nodes": 3, // total number of nodes in the cluster
"num.racks": 1 // total number of racks in the cluster, it divides num.nodes into the racks evenly, optional, the default value is 1
}
{
"am.type" : "mapreduce", // type of AM, optional, the default value is "mapreduce"
"job.start.ms" : 0, // job start time
"job.end.ms" : 95375, // job finish time, optional, the default value is 0
"job.queue.name" : "sls_queue_1", // the queue job will be submitted to
"job.id" : "job_1", // the job id used to track the job, optional. The default value, an zero-based integer increasing with number of jobs, is used if this is not specified or job.count > 1
"job.user" : "default", // user, optional, the default value is "default"
"job.count" : 1, // number of jobs, optional, the default value is 1
"job.tasks" : [ {
"count": 1, // number of tasks, optional, the default value is 1
"container.host" : "/default-rack/node1", // host the container asks for
"container.start.ms" : 6664, // container start time, optional
"container.end.ms" : 23707, // container finish time, optional
"container.duration.ms": 50000, // duration of the container, optional if start and end time is specified
"container.priority" : 20, // priority of the container, optional, the default value is 20
"container.type" : "map" // type of the container, could be "map" or "reduce", optional, the default value is "map"
}, {
"container.host" : "/default-rack/node3",
"container.start.ms" : 6665,
"container.end.ms" : 21593,
"container.priority" : 20,
"container.type" : "map"
}, {
"container.host" : "/default-rack/node2",
"container.start.ms" : 68770,
"container.end.ms" : 86613,
"container.priority" : 20,
"container.type" : "map"
} ]
}
{
"am.type" : "mapreduce",
"job.start.ms" : 105204,
"job.end.ms" : 197256,
"job.queue.name" : "sls_queue_2",
"job.id" : "job_2",
"job.user" : "default",
"job.tasks" : [ {
"container.host" : "/default-rack/node1",
"container.start.ms" : 111822,
"container.end.ms" : 133985,
"container.priority" : 20,
"container.type" : "map"
}, {
"container.host" : "/default-rack/node2",
"container.start.ms" : 111788,
"container.end.ms" : 131377,
"container.priority" : 20,
"container.type" : "map"
} ]
}
SYNTH JSON输入文件格式
这里我们提供了一个合成生成器json文件的示例格式。我们使用(JSON-不合格)内联注释解释每个参数的使用。
{
"description" : "tiny jobs workload", //description of the meaning of this collection of workloads
"num_nodes" : 10, //total nodes in the simulated cluster
"nodes_per_rack" : 4, //number of nodes in each simulated rack
"num_jobs" : 10, // total number of jobs being simulated
"rand_seed" : 2, //the random seed used for deterministic randomized runs
// a list of “workloads”, each of which has job classes, and temporal properties
"workloads" : [
{
"workload_name" : "tiny-test", // name of the workload
"workload_weight": 0.5, // used for weighted random selection of which workload to sample from
"queue_name" : "sls_queue_1", //queue the job will be submitted to
//different classes of jobs for this workload
"job_classes" : [
{
"class_name" : "class_1", //name of the class
"class_weight" : 1.0, //used for weighted random selection of class within workload
//nextr group controls average and standard deviation of a LogNormal distribution that
//determines the number of mappers and reducers for thejob.
"mtasks_avg" : 5,
"mtasks_stddev" : 1,
"rtasks_avg" : 5,
"rtasks_stddev" : 1,
//averge and stdev input param of LogNormal distribution controlling job duration
"dur_avg" : 60,
"dur_stddev" : 5,
//averge and stdev input param of LogNormal distribution controlling mappers and reducers durations
"mtime_avg" : 10,
"mtime_stddev" : 2,
"rtime_avg" : 20,
"rtime_stddev" : 4,
//averge and stdev input param of LogNormal distribution controlling memory and cores for map and 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,
//probability of running this job with a reservation
"chance_of_reservation" : 0.5,
//input parameters of LogNormal distribution that determines the deadline slack (as a multiplier of job duration)
"deadline_factor_avg" : 10.0,
"deadline_factor_stddev" : 0.001,
}
],
// for each workload determines with what probability each time bucket is picked to choose the job starttime.
// In the example below the jobs have twice as much chance to start in the first minute than in the second minute
// of simulation, and then zero chance thereafter.
"time_distribution" : [
{ "time" : 1, "weight" : 66 },
{ "time" : 60, "weight" : 33 },
{ "time" : 120, "jobs" : 0 }
]
}
]
}
模拟器输入拓扑文件格式
下面是一个输入拓扑文件示例,其中有3个节点组织在一个机架中。
{
"rack" : "default-rack",
"nodes" : [ {
"node" : "node1"
}, {
"node" : "node2"
}, {
"node" : "node3"
}]
}