yarn SLS公平调度器测试

时间:2021-11-16 14:37:57

SLS测试简介

sls是Scheduler Load Simulator的缩写,是一个用来测试yarn调度器性能的工具。其实,若想完成测试,一共需要用到两个工具:Hadoop Rumen和SLS,下面逐个介绍。

Hadoop Rumen

Hadoop Rumen,是一个针对MR设计的日志解析分析工具。在SLS里,可以用这个工具解析mr jobhistory server的日志(可以解析一天的、一周的),来生成模仿提交任务的数据。

Hadoop Rumen有两个组件:

  1. TraceBuilder(轨迹生成器):将MR jh日志转换成易解析的格式,目前支持json格式。
  2. Folder(折叠器):一个扩展输入trace的工具,可以通过丢弃job来减少任务数,或者通过增加空任务来扩展任务数。

使用步骤:

  1. 使用TraceBuilder工具解析MR JH日志,生成job-trace文件

    hadoop jar \
    $HADOOP_HOME/share/hadoop/tools/lib/hadoop-rumen-2.7.1.jar \
    org.apache.hadoop.tools.rumen.TraceBuilder \
    file:///tmp/job-trace.json \ #输出文件
    file:///tmp/job-topology.json \ #输出文件
    hdfs:ns1/history/logs #mr jh路径

  2. 使用Folder工具对job-trace文件进行拓展

    hadoop jar \
    $HADOOP_HOME/share/hadoop/tools/lib/hadoop-rumen-2.7.1.jar \
    org.apache.hadoop.tools.rumen.Folder \
    -output-duration 2h \ #所有任务执行总时间
    -input-cycle 20m \ #任务切片区间
    -skew-buffer-length 50 \ #最大数据倾斜job数
    file:///tmp/job-trace.json \ #输入文件
    file:///tmp/job-trace-2hr.json #输出文件

  3. job-trace-2hr.json文件可以用来作为sls工具的输入参数–input-rumen,也可以通过rumen2sls.sh工具转换为–input-sls

Yarn Scheduler Load Simulator (SLS)

sls目录为 $HADOOP_HOME/share/hadoop/tools/sls,包含如下四个目录

  1. bin: 测试脚本坐在目录
  2. html: 包含web界面所需的html/css/js等文件
  3. sample-conf: demo配置文件
  4. sample-data: demo数据

下面先玩玩官方自带的Demo,然后再根据线上的数据进行一些实操。

运行官方Demo

  1. 准备一个hadoop包,不用启动任何服务,配置可以参考sample-conf
  2. 然后编辑yarn-site.xml和sls-runner.xml来进行一些简单的配置,就当熟悉熟悉配置项吧。
  3. 用rumen2sls.sh脚本生成两个sls文件: sls-jobs.json、sls-nodes.json

    $HADOOP_HOME/share/hadoop/tools/sls/bin/rumen2sls.sh \
    --rumen-file=$HADOOP_HOME/share/hadoop/tools/sls/sample-data/2jobs2min-rumen-jh.json \
    --output-dir=sls/output2/
  4. 用slsrun.sh脚本和sls文件进行模拟测试,注意运行此步骤时需要保证sls/html目录在classpath中或者在执行命令的当前目录,否则web服务会不能启动并报错
    java.lang.NullPointerException
    at org.apache.hadoop.yarn.sls.web.SLSWebApp.(SLSWebApp.java:86)。

    sh $HADOOP_HOME/share/hadoop/tools/sls/bin/slsrun.sh \
    --input-sls=sls/output2/sls-jobs.json \
    --nodes=sls/output2/sls-nodes.json \
    --output-dir=sls/output1 \
    --print-simulation
  5. 用浏览器打开localhost:10001查看指标即可

实战

  1. 准备一个hadoop包,不用启动任何服务,配置可以参考sample-conf
  2. 参考上文HadoopRumen操作步骤,用hadoop rumen工具基于history server日志生成trace文件、拓扑结构文件。使用的jh日志不宜太多,否则生成会很慢。我实测1小时大概能基于50G的jh日式生成10G的数据,而且如果生成过程中使用ctrl+c等结束操作,这个生成的文件是不可用的。。

    hadoop jar \
    $HADOOP_HOME/share/hadoop/tools/lib/hadoop-rumen-2.7.1.jar \
    org.apache.hadoop.tools.rumen.TraceBuilder \
    job-trace.json \ #输出的作业轨迹文件
    job-topology.json \ #输出的集群拓扑结构文件
    hdfs://namenodeip:8020/userlogs/history/done/2017/08/08/002493/
  3. 用rumen2sls.sh脚本,将生成的job-trace.json数据转换成sls格式数据sls-jobs.json。注:这里只用到了job-trace文件,没有用到拓扑结构文件。job-topology.json文件不是必要的,后面的操作都没有用到。

    $HADOOP_HOME/share/hadoop/tools/sls/bin/rumen2sls.sh \
    --rumen-file=job-trace.json \
    --output-dir=output/
  4. 基于sls-jobs.json文件进行sls测试即可
  5. 可以通过在hadoop-env.sh里添加如下参数更改jvm大小

    HADOOP_CLIENT_OPTS="-server -Xmx24g -Xms24g -Xmn12g -XX:PermSize=1g -XX:MaxPermSize=1g"
  6. 还有一点就是集群中的fair-scheduler.xml拷贝到测试环境的HADOOP_CONF_DIR下,可以通过配置sls-runner.xml来模拟线上集群的规模、资源量等

总结

本来以为2-3天能搞定的事情,结果做了一周才弄好。期间走过的弯路,在这做个总结。

  1. sls测试准备测试环境是非常简单的,最难最耗时最让人头疼的是整理数据。如何找到能测出瓶颈的数据是关健,怎么找呢? 有几个办法,1是找线上集群最繁忙时段的jh日志进行解析测试。2是修改hadoop-sls项目的源代码,可以将一份数据进行多次拷贝(当然,每次要记得修改job_jd)。
  2. fair-scheduler.xml很重要,如果与sls-job数据不匹配,会导致任务提不上去(找不到队列信息嘛)。
  3. 如果集群的rack信息配置的不标准,hadoop-sls工具会解析rack失败,报错

    java.net.UnknownHostException: rack
  4. 还有一个地方更坑,如果sls-job文件中有job的finishTime=-1,解析时会报错。没办法,只能改源码了。

    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    at org.apache.hadoop.yarn.sls.RumenToSLSConverter.createSLSJob(RumenToSLSConverter.java:170)
    at org.apache.hadoop.yarn.sls.RumenToSLSConverter.generateSLSLoadFile(RumenToSLSConverter.java:132)
    at org.apache.hadoop.yarn.sls.RumenToSLSConverter.main(RumenToSLSConverter.java:116)

目前遇到的就这些,大家还有什么问题可以留言交流。