原理

Dynamometer是一款由linked开源的HDFS性能测试工具,旨在以最小的硬件资源来模拟真实的集群效果,以此做相应的性能测试。

Dynamometer 运行在一个 YARN 应用程序上,主要有以下三个功能:

1.Infrastructure——集群的模拟,启动单个 NameNode 和可配置数量的 DataNode,将整个 HDFS 集群模拟为单个应用程序。
2.Workload ——客户端(client)的模拟,以NameNode 上生成负载。
3.driver——协调其他两个组件,让用户用单个命令调试参数,并完成完整测试。

官网的两张图完美地解释了其工作原理:

hadoop跑测试程序 hadoop性能测试工具_big data


这张图告诉我们,Dynamometer用存储在HDFS集群上的Fsimage模拟NameNode,用同样存储在HDFS集群上的Block Listings模拟DataNode。它们都运行在HDFS集群的yarn上,受命于Dynamometer Driver输入的命令。

hadoop跑测试程序 hadoop性能测试工具_hadoop_02


同样,这张图告诉我们,存储在HDFS集群上的审计日志(Audit Logs)模拟读、写等操作的重放(以map-reduce任务的形式),联合DataNode的变化信息、心跳等,对NameNode进行压力测试。读写操作的重放可以倍速进行,以测试更大压力下NN的表现。

Dynamometer的基本功能就是这些,还有一些需要探索的部分,官方文档也没写,需要在使用中使用–help参数逐渐掌握。

更多关于其原理介绍,可见:
github:
https://github.com/linkedin/dynamometer 以及官方文档页面最下方
https://hadoop.apache.org/docs/stable/hadoop-dynamometer/Dynamometer.html

初探

注意:Dynamometer在hadoop3.3.0版本后,正式被集成进apache-hadoop大家族了。官方声称:可以使用单个版本的 Dynamometer 和单个底层主机集群轻松测试多个版本的 HDFS。
对之前的版本,官方声明并未完全进行测试;
而对于2.x的版本,经过测试的版本为:
Hadoop 2.7 starting at 2.7.4
Hadoop 2.8 starting at 2.8.4

本文操作的hadoop版本均为3.2.0,属于硬作死的那种…由于没有工具,下文提到的.sh脚本和jar包,都是下载了3.3.1版本之后再进行拷贝得到的。

下载3.3.1-binary,把share/hadoop/tools/dynamometer/dynamometer-{infra,workload,blockgen}/bin中的所有脚本文件拷到对应的文件中;把share/hadoop/tools/lib/中的所有jar文件也拷到对应的文件中。

另外,对已存在的HDFS集群,就称其为HDFS集群;对在yarn中模拟出的集群,则称其为Dyno-HDFS集群。同法称呼Dyno-NN和Dyno-DN。

1、fsimage

找一个fsimage文件,使用如下命令:

hdfs oiv -i fsimage_TXID -o fsimage_TXID.xml -p XML

生成fsimage文件对应的xml文件。其中,TXID为fsimage的id。
根据官方文档介绍,fsimage推荐找Standby/Secondary Namenode。
最后,把fsimage_TXID、fsimage_TXID.xml和同文件夹下的fsimage_TXID.md5、VERSION文件一同放到集群的同一文件下,如:hdfs://dyno/fsimage。如下文所说:

All of these files must be placed somewhere on HDFS where
the various jobs will be able to access them. They should 
all be in the same folder, e.g. hdfs:///dyno/fsimage.

上述所有步骤也可以用一个脚本搞定:

./dynamometer-infra/bin/upload-fsimage.sh TXID hdfs:///dyno/fsimage

本人在测试时,脚本报错找不到fsimage,故采用第一种方式,用4个put上传到hdfs:///dyno/fsimage文件夹里。

2、hadoop binary

用Dynamometer自带的脚本精简binary包。

./create-slim-hadoop-tar.sh hadoop-3.2.0.tar.gz 
Slimming hadoop-3.2.0.tar.gz;
size before is 312M
Finished; size after is 191M

tar包可以存放在本地或者HDFS集群上。
这里放在:/home/hadoop/output/hadoop-3.2.0.tar.gz

3、Configurations

准备配置文件:将HDFS集群的etc/hadoop文件夹下的所有文件复制一份儿,准备一个文件夹放置即可。同样,也可以放在本地或者hadoop集群上。这里放在:/home/hadoop/hadoop-conf目录下。

4、Block Generation

用fsimage_xxx.xml生成Dyno-HDFS集群中的Dyno-DN

./generate-block-lists.sh -fsimage_input_path hdfs://dyno/fsimage/fsimage_0000000003230921543.xml -block_image_output_dir hdfs://dyno/blocks -num_reducers 4 -num_datanodes 17

模拟生成的块文件保存的路径由block_image_output_dir参数决定
num_reducers参数决定生成块作业的reducer的数量
num_datanodes参数决定模拟出的datanode的数量

至此,Dyno-HDFS集群已搭建完毕,我们可以准备启动和测试了。

补充:为了进行压力测试,我们需要搞一些审计日志,同样存放在指定位置,用来下文模拟client对nn的请求。审计日志的开启和采集方法此处不再缀叙。

5、Running

执行命令

./start-dynamometer-cluster.sh
 -hadoop_binary_path hadoop-3.2.0.tar.gz
 -conf_path my-hadoop-conf
 -fs_image_dir hdfs://dyno/fsimage
 -block_list_path hdfs://dyno/blocks

用以模拟生成Dyno-HDFS集群,此时一个模拟的集群已成功运行。其中的参数都很好理解,不再缀叙。

然后,输入如下命令:

./start-workload.sh -Dauditreplay.input-path=hdfs://dyno/audit_logs/ -Dauditreplay.output-path=hdfs://dyno/results4/ -Dauditreplay.num-threads=50 -nn_uri hdfs://master1:50070/ -start_time_offset 5m -mapper_class_name AuditReplayMapper

来模拟client发送请求。
这里,Dauditreplay.input-path参数的值为存放审计日志的路径,
Dauditreplay.output-path为输出结果的路径,
Dauditreplay.num-threads为每个审计日志分配的线程数,
nn_uri为namenode的地址,start_time_offset则为任务开始的时间偏移量。

此处可以用-help查看更多参数:

./start-workload.sh -h
usage: ./start-workload [options]
-h,–help Shows this message. Additionally specify the mapper_class_name argument to show help for a specific mapper class.
-mapper_class_name Class name of the mapper; must be a WorkloadMapper subclass. Mappers supported currently:
1. AuditReplayMapper
2. CreateFileMapper
Fully specified class names are also supported.
-nn_uri URI of the NameNode under test
-start_time_offset Mapper start time as an offset from current time. Human-readable formats accepted, e.g. 10m (default 1m).
-start_timestamp_ms Mapper start UTC timestamp in ms

AuditReplayMapper 将基准测试结果以 CSV 格式输出到输出目录中的文件 part-r-00000 中。每行的格式为 user,type,operation,numops,cumulative latency(时延),例如hdfs,WRITE,MKDIRS,2,150.