0%

TestDFSIO性能测试工具使用方法

本文主要介绍 HDFS 性能测试工具的功能、参数说明、读写性能测试使用方法及结果分析。

简介

TestDFSIO是Hadoop系统自带的基准测试组件,用于测试Hadoop文件系统通过MapReduce方式处理作业的IO 属性。TestDFSIO调用一个MapReduce作业来并发地执行读写操作,每个map任务用于读或写每个文件,reduce 用于累积统计信息,并产生统计总结。

源码地址

hadoop/TestDFSIO.java at trunk · apache/hadoop
https://github.com/apache/hadoop/blob/trunk/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/fs/TestDFSIO.java

参数解析

1
2
3
4
[root@manager ~]# hadoop jar /usr/hdp/3.0.1.0-187/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO
20/11/04 19:31:31 INFO fs.TestDFSIO: TestDFSIO.1.8
Missing arguments.
Usage: TestDFSIO [genericOptions] -read [-random | -backward | -skip [-skipSize Size]] | -write | -append | -truncate | -clean [-compression codecClassName] [-nrFiles N] [-size Size[B|KB|MB|GB|TB]] [-resFile resultFileName] [-bufferSize Bytes] [-storagePolicy storagePolicyName] [-erasureCodePolicy erasureCodePolicyName]
  • read:读测试,对每个文件读-size指定的字节数
  • write:写测试,对每个文件写-size指定的字节数
  • append:追加测试,对每个文件追加-size指定的字节数
  • truncate:截断测试,对每个文件截断至-size指定的字节数
  • clean:清除TestDFSIO在HDFS上生成数据
  • n:文件个数
  • size:每个文件的大小,必须加单位,单位可为B、KB、MB、GB、TB
  • resFile:生成测试报告的本地文件路径,多次测试可使用同一个文件,结果会追加
  • bufferSize:每个mapper任务读写文件所用到的缓存区大小,默认为1000000字节。

测试步骤

清理缓存

在每个DataNode节点执行

1
2
sync
echo 3 > /proc/sys/vm/drop_caches

这里主要是清理cache/buffer,可以通过free -h命令查看。缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

sync是将cache/buffer持久化至磁盘
echo 3 > /proc/sys/vm/drop_caches是清理cache/buffer区。

清除测试数据

以下命令均使用hdfs用户执行

1
2
su hdfs
hadoop jar /usr/hdp/3.0.1.0-187/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -clean

写文件测试

写10个100M的文件

1
hadoop jar /usr/hdp/3.0.1.0-187/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -write -nrFiles 10 -size 100MB -resFile /tmp/DFSIO-write.out

查看结果

1
2
3
4
5
6
7
8
9
cat /tmp/DFSIO-write.out
----- TestDFSIO ----- : write
Date & time: Tue Sep 29 16:36:44 CST 2020
Number of files: 10
Total MBytes processed: 1000
Throughput mb/sec: 1.56
Average IO rate mb/sec: 3.33
IO rate std deviation: 3.67
Test exec time sec: 290.91

结果解析:

  • Date & time:结果输出时间;
  • Number of files:文件数量,本次执写10个文件,也是task数量,即任务数;
  • Total MBytes processed:总共处理的文件大小,即数据总量,以MB为单位,因为本次写10个文件,每个文件100M,所以这里是10*100=1000;
  • Throughput mb/sec:吞吐量,以MB/s为单位,计算方法是:(数据总量)/(每个map任务实际写入数据的执行时间之和);
  • Average IO rate mb/sec:平均IO速率,单位MB/s,计算方法是:(每个map需要写入的数据量/每个map任务实际写入数据的执行时间)之和/任务数;
  • IO rate std deviation:IO速率标准差;
  • Test exec time sec:测试执行时间,单位:s。

查看数据

1
hadoop fs -du -h /benchmarks/TestDFSIO/io_data

读文件测试

执行读测试时,首先需要有文件,因此可在写文件测试之后执行相应的读文件测试,这里读取10个文件,每个文件100M。

1
hadoop jar /usr/hdp/3.0.1.0-187/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -read -nrFiles 10 -size 100MB -resFile /tmp/DFSIO-read.out

查看结果

1
2
3
4
5
6
7
8
9
cat /tmp/DFSIO-read.out
----- TestDFSIO ----- : read
Date & time: Tue Sep 29 16:41:20 CST 2020
Number of files: 10
Total MBytes processed: 1000
Throughput mb/sec: 376.51
Average IO rate mb/sec: 644.25
IO rate std deviation: 445.27
Test exec time sec: 135.63

清除测试数据

1
hadoop jar /usr/hdp/3.0.1.0-187/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -clean

执行脚本

为了方便测试,可使用脚本执行,如下是执行数据文件数分别为10个、100个、1000个和10000个,每个文件为128M的读写测试,且执行三遍,这样可以求取平均值,更准确。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#/bin/bash

# jar 包路径
hdf_test_jar_home=/usr/hdp/3.0.1.0-187/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar

# 文件数量
file_num=(10 100 1000 10000)

# 每个文件的大小
file_size=128MB

echo "====================Start execute HDFS I/O test ======================"
for i in {1..3}
do

for num in ${file_num[*]}
do

# 清除数据
echo "Start clean data ... "
hadoop jar $hdf_test_jar_home TestDFSIO -clean

# 写性能测试
echo "====================Start execute write test, ' $i ' time, file_num:' $num ', file_size:' $file_size '===================="
hadoop jar $hdf_test_jar_home TestDFSIO -write -nrFiles $num -fileSize $file_size -resFile /tmp/DFSIO-write.out

# 读性能测试
echo "Start execute read test, ' $i ' time, file_num:' $num ', file_size:' $file_size' "
hadoop jar $hdf_test_jar_home TestDFSIO -read -nrFiles $num -fileSize $file_size -resFile /tmp/DFSIO-read.out

# 睡眠10s
sleep 10
done
done

参考资料

[Hadoop] 使用DFSIO测试集群I/O性能_mryqu_新浪博客
http://blog.sina.com.cn/s/blog_72ef7bea0102vr44.html

linux下的缓存机制buffer、cache、swap - 运维总结 - 散尽浮华 - 博客园
https://www.cnblogs.com/kevingrace/p/5991604.html

TestDFSIO基准测试方法介绍_湖南频道_凤凰网
http://hunan.ifeng.com/a/20190613/7496675_0.shtml