在Hadoop中包含很多的基准测试,用来验证集群的HDFS是不是设置合理,性能是不是达到预期,DFSIO是Hadoop的一个基准测试工具,被用来分析集群HDFS的I/O性能。 DFSIO后台执行MapReduce框架,其中Map任务以并行方式读写文件,Reduce任务用来收集和汇总性能数字。可以通过这个基准测试对比吞吐量、IO速率的结果以及整个磁盘的原始速度,来确定你的集群是否得到了期待的性能。另外,可以通过这些测试中指标的严重偏差发现集群中一个或多个问题节点,结合监控系统一起使用能够更好的定位Hadoop集群的瓶颈所在。
执行以下命令来运行HDFS写性能测试,其中参数-nrFiles指定了测试中要写的文件数目,参数-fileSize指明了写入每个文件的大小单位是MB。该命令会在HDFS上产生一系列的文件存放在HDFS的/benchmarks/TestDFSIO文件夹下。 请注意,由于部署了Kerberos,HDFS不允许任意读写,此时需要kinit某个用户,然后指定TestDFSIO的写目录,指定方法为: 添加参数-D test.build.data=/user/用户名/benchmark 由于我们yarn配置了允许的用户: 所以用以上用户来测试,这里我选择hive用户。
[root@hadoop102 ~]# kinit -kt /var/lib/hive/hive.keytab hive/hive [root@hadoop102 ~]# hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-3.0.0-cdh6.2.1-tests.jar TestDFSIO -Dtest.build.data=/user/hive/benchmark -write -nrFiles 100 -fileSize 10 20/10/06 11:09:14 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write 20/10/06 11:09:14 INFO fs.TestDFSIO: Date & time: Tue Oct 06 11:09:14 CST 2020 20/10/06 11:09:14 INFO fs.TestDFSIO: Number of files: 100 20/10/06 11:09:14 INFO fs.TestDFSIO: Total MBytes processed: 1000 20/10/06 11:09:14 INFO fs.TestDFSIO: Throughput mb/sec: 24.37 20/10/06 11:09:14 INFO fs.TestDFSIO: Average IO rate mb/sec: 29 20/10/06 11:09:14 INFO fs.TestDFSIO: IO rate std deviation: 11.67 20/10/06 11:09:14 INFO fs.TestDFSIO: Test exec time sec: 132.93 20/10/06 11:09:14 INFO fs.TestDFSIO:性能基准测试针对HDFS的读操作进行,读操作将用到第一步的写操作,因此写操作必须在读操作之前执行。
[root@hadoop102 ~]# hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-3.0.0-cdh6.2.1-tests.jar TestDFSIO -D test.build.data=/user/hive/benchmark -read -nrFiles 100 -fileSize 10 20/10/06 11:13:02 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read 20/10/06 11:13:02 INFO fs.TestDFSIO: Date & time: Tue Oct 06 11:13:02 CST 2020 20/10/06 11:13:02 INFO fs.TestDFSIO: Number of files: 100 20/10/06 11:13:02 INFO fs.TestDFSIO: Total MBytes processed: 1000 20/10/06 11:13:02 INFO fs.TestDFSIO: Throughput mb/sec: 396.51 20/10/06 11:13:02 INFO fs.TestDFSIO: Average IO rate mb/sec: 492.79 20/10/06 11:13:02 INFO fs.TestDFSIO: IO rate std deviation: 184.65 20/10/06 11:13:02 INFO fs.TestDFSIO: Test exec time sec: 122.55 20/10/06 11:13:02 INFO fs.TestDFSIO:在某一集群运行此命令,此集群配置10个datanode和3个namenode,每个节点采用10块2T硬盘,128G内存,32核CPU,采用双千兆网口,结果如下:
Hadoop的TeraSort是一个常用的测试,目的是利用MapReduce来尽可能快的对数据进行排序。TeraSort使用MapReduce框架通过分区操作将Map过程中的结果输出到Reduce任务,确保整体排序的顺序。TeraSort测试可以很好的对MapReduce框架的每个过程进行压力测试,为调优和配置Hadoop集群提供一个合理的参考。
在进行TeraSort测试之前的一个准备过程就是数据的产生,可以使用teragen命令来生成TeraSort测试输入的数据。teragen命令的第一个参数是记录的数目,第二个参数是生成数据的HDFS目录。下面这个命令在HDFS的terasort-input目录中生成1GB的数据,由1千万条记录组成。
[root@hadoop102 ~]# time hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar teragen 10000000 /user/hive/terasort-input注:time是linux下的命令,可以获取到一个程序的执行时间,包括程序的实际运行时间(real time),以及程序运行在用户态的时间(user time)和内核态的时间(sys time)。
验证TeraSort基准测试程序结果的正确性,可以使用teravalidate命令来执行。第一个参数是排序的结果集的HDFS上的位置。第二个参数是验证结果集正确性的报告存放位置。
[root@hadoop102 ~]# time hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar teravalidate /user/hive/terasort-ouput /user/hive/terasort-validate [root@hadoop102 ~]# hadoop fs -cat /user/hive/terasort-validate/part-r-00000 checksum 4c49607ac53602该文件有内容,说明结果是有序的。
在某一集群运行此命令,此集群配置10个datanode和3个namenode,每个节点采用10块2T硬盘,128G内存,32核CPU,结果如下: TeraSort命令耗时46.553s
