本文介绍集群在顺序写、顺序读、随机写等方面的性能测试方法。

注意事项

性能测试前,请注意以下事项。

  • 吞吐最大不会超过ECS带宽。如果您的ECS带宽只有 1.5Gbps,则吞吐最高可达到187.5MB/s。
  • 文件存储HDFS的吞吐能力和购买的存储空间相关。
  • 测试集群吞吐性能所使用的TestDFSIO是一个分布式任务,存在任务调度及结果汇总阶段,计算集群吞吐均值时会略低于文件存储HDFS吞吐限速。
  • 在进行顺序读与随机读的测试之前需要确保文件存储HDFS之上已有指定的待测数据,如果没有待测数据请使用顺序写先生成待测数据再进行顺序读与随机读的测试。

测试环境

配置名称 配置说明
计算VM配置 CPU核数:4核
内存:16G
机器数量:6台
网络带宽:1.5Gbps
文件存储HDFS配置 实例大小:10T
吞吐限速:1000MB/s
软件配置 Apache Hadoop:Hadoop 2.7.6

测试工具

TestDFSIO是Hadoop系统自带的基准测试组件,用于测试DFS的IO吞吐性能。

TestDFSIO的jar包位于开源hadoop版本的$HADOOP_HOME/share/hadoop/mapreduce目录下,其中$HADOOP_HOME为测试机器中的Hadoop 安装目录,jar包名为hadoop-mapreduce-client-jobclient-x.x.x-tests.jar,TestDFSIO使用方法如下所示。

[root@node1 bin]# ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.6-tests.jar TestDFSIO
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] [-rootDir]

顺序写性能测试

预估值:1000MB/s

  1. 将文件写入到文件存储HDFS。

    将500个大小为4G的文件按顺序写入到文件存储HDFS,读写数据的缓存大小为8M,并将统计数据写入 /tmp/TestDFSIOwrite.log中。

    ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.6-tests.jar TestDFSIO -write -nrFiles 500 -size 4GB -bufferSize 8388608 -resFile /tmp/TestDFSIOwrite.log
  2. 执行以下命令查看文件存储HDFS已写入的文件数量及大小。
    ./hadoop fs -count -q -h /benchmarks/TestDFSIO/io_data
  3. 执行以下命令查看生成的统计信息文件。
    cat /tmp/TestDFSIOwrite.log

    测试结果如下所示。

    • Total MBytes processed:写入的文件的总大小。
    • Test exec time sec:消耗的时长。


  4. 计算集群吞吐。
    您可以通过以下两种方式计算集群吞吐。
    • 通过统计信息文件计算吞吐。

      集群的吞吐约为Total MBytes processed / Test exec time sec = 985.16 MB/s

    • 通过ECS监控的带宽流出速率,计算集群吞吐。

      进行顺序写时集群中每个节点的带宽流出速率大约为1.4Gb/s、1.4Gb/s、1.4Gb/s、1.1Gb/s、1.1Gb/s、1.45Gb/s。

      集群吞吐=(1.4+1.4+1.4+1.1+1.1+1.45)*1000/8=981.25MB/s



顺序读性能测试

预估值:1000MB/s

  1. 按顺序读取文件存储HDFS上的文件。

    顺序读取文件存储HDFS上面500个大小为4G的文件,读写数据的缓存大小为8M,并将统计数据写入/tmp/TestDFSIOread.log中。

    ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.6-tests.jar TestDFSIO -read -nrFiles 500 -size 4GB -bufferSize 8388608 -resFile /tmp/TestDFSIOread.log
  2. 执行以下命令查看生成的统计信息文件。
    cat /tmp/TestDFSIOread.log
    测试结果如下所示。
    • Total MBytes processed:写入的文件的总大小。
    • Test exec time sec:消耗的时长。


  3. 计算集群吞吐。
    您可以通过以下两种方式计算集群吞吐。
    • 通过统计信息文件计算吞吐。

      集群的吞吐约为Total MBytes processed / Test exec time sec = 989.15 MB/s

    • 通过ECS监控的带宽流出速率,计算集群吞吐。

      进行顺序读时集群中每个节点的带宽流入速率大约为1.4Gb/s,1.45Gb/s,1.1Gb/s,1.4Gb/s,1.45Gb/s,1.1Gb/s

      集群吞吐=(1.4+1.45+1.1+1.4+1.45+1.1)*1000/8=987.5MB/s



随机读性能测试

预估值:1000MB/s

  1. 随机读取文件存储HDFS上的文件。

    随机读取文件存储HDFS上面的大小为1G的500个文件,读写数据的缓存大小为8M,并将统计数据写入/tmp/TestDFSIOrandomread.log中。

    ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.6-tests.jar TestDFSIO -read -random -nrFiles 500 -size 1GB -bufferSize 8388608 -resFile /tmp/TestDFSIOrandomread.log
  2. 执行以下命令查看生成的统计信息文件。
    cat /tmp/TestDFSIOrandomread.log

    测试结果如下所示。

    • Total MBytes processed:写入的文件的总大小。
    • Test exec time sec:消耗的时长。


  3. 计算集群吞吐。
    您可以通过以下两种方式计算集群吞吐。
    • 通过统计信息文件计算吞吐。

      集群的吞吐约为Total MBytes processed / Test exec time sec = 962.07 MB/s

    • 通过ECS监控的带宽流出速率,计算集群吞吐。

      进行随机读时集群中每个节点的带宽流入速率大约为1.35Gb/s,1.2Gb/s,1.4Gb/s,1.1Gb/s,1.4Gb/s,1.35Gb/s

      集群吞吐=(1.35+1.2+1.4+1.1+1.4+1.35)*1000/8=975MB/s