SLS测试简介
sls是Scheduler Load Simulator的缩写,是一个用来测试yarn调度器性能的工具。其实,若想完成测试,一共需要用到两个工具:Hadoop Rumen和SLS,下面逐个介绍。
Hadoop Rumen
Hadoop Rumen,是一个针对MR设计的日志解析分析工具。在SLS里,可以用这个工具解析mr jobhistory server的日志(可以解析一天的、一周的),来生成模仿提交任务的数据。
Hadoop Rumen有两个组件:
- TraceBuilder(轨迹生成器):将MR jh日志转换成易解析的格式,目前支持json格式。
- Folder(折叠器):一个扩展输入trace的工具,可以通过丢弃job来减少任务数,或者通过增加空任务来扩展任务数。
使用步骤:
使用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路径使用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 #输出文件job-trace-2hr.json文件可以用来作为sls工具的输入参数–input-rumen,也可以通过rumen2sls.sh工具转换为–input-sls
Yarn Scheduler Load Simulator (SLS)
sls目录为 $HADOOP_HOME/share/hadoop/tools/sls,包含如下四个目录
- bin: 测试脚本坐在目录
- html: 包含web界面所需的html/css/js等文件
- sample-conf: demo配置文件
- sample-data: demo数据
下面先玩玩官方自带的Demo,然后再根据线上的数据进行一些实操。
运行官方Demo
- 准备一个hadoop包,不用启动任何服务,配置可以参考sample-conf
- 然后编辑yarn-site.xml和sls-runner.xml来进行一些简单的配置,就当熟悉熟悉配置项吧。
- 用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/ - 用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 - 用浏览器打开localhost:10001查看指标即可
实战
- 准备一个hadoop包,不用启动任何服务,配置可以参考sample-conf
- 参考上文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/ - 用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/ - 基于sls-jobs.json文件进行sls测试即可
- 可以通过在hadoop-env.sh里添加如下参数更改jvm大小
HADOOP_CLIENT_OPTS="-server -Xmx24g -Xms24g -Xmn12g -XX:PermSize=1g -XX:MaxPermSize=1g" - 还有一点就是集群中的fair-scheduler.xml拷贝到测试环境的HADOOP_CONF_DIR下,可以通过配置sls-runner.xml来模拟线上集群的规模、资源量等
总结
本来以为2-3天能搞定的事情,结果做了一周才弄好。期间走过的弯路,在这做个总结。
- sls测试准备测试环境是非常简单的,最难最耗时最让人头疼的是整理数据。如何找到能测出瓶颈的数据是关健,怎么找呢? 有几个办法,1是找线上集群最繁忙时段的jh日志进行解析测试。2是修改hadoop-sls项目的源代码,可以将一份数据进行多次拷贝(当然,每次要记得修改job_jd)。
- fair-scheduler.xml很重要,如果与sls-job数据不匹配,会导致任务提不上去(找不到队列信息嘛)。
- 如果集群的rack信息配置的不标准,hadoop-sls工具会解析rack失败,报错
java.net.UnknownHostException: rack - 还有一个地方更坑,如果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)
目前遇到的就这些,大家还有什么问题可以留言交流。