利用基准测试程序测试Hadoop集群
集群是否已被正确建立?这个问题最好通过实验来回答:运行若干作业,并确信获 得了预期结果。基准测试程序所执行的测试计划合理,用户获得实验结果之后,还 可以和其他集群做比较,以检测新集群是否基本上运作正常。测试结果的另一个用 途是可以据此调整集群设置以优化整体性能。这点一般通过监控系统实现,用户可以监测集群中的资源使用情况。
为了获得最佳测试结果,集群不能在运行基准测试程序时还同时运行其他任务。在 现实情况下,一般在集群被投入服务之前进行测试。_旦用户已经在集群上周期性 地调度作业,想找到集群完全空闲的时间就非常困难了(除非和其他用户协商一个 停止服务的时间段)。总而言之,基准测试程序最好在此之前就执行。
经验表明,硬盘故障是新系统最常见的硬件故障。通过运行含有髙强度I/O操作的 基准测试程序一例如即将提到的基准测试程序——就能在系统正式上线前对集群 做“烤机”测试。
Hadoop基准测试程序
Hadoop自带若干基准测试程序,安装开销小,运行方便。基准测试程序通常被打 包为一个test JAR文件,无参数解压缩之后,就可以获取文件列表和说明文档:
% hadoop jar $HADOOP_INSTALL/hadoop-*-test.jar
如果不指定参数,大多数基准测试程序都会显示具体用法。示例如下:
% hadoop jar $HADOOP_INSTALL/hadoop_*-test.jar TestDFSIOTestFDSIO.0.0.4Usage: TestFDSIO -read | -write 丨-clean [-nrFiles N] [-fileSize MB][-resFile resultFileName] [-bufferSize Bytes]
使用TestDFSIO来测试HDFS
TestDFSIO能够用于测试HDFS的I/O性能。它用一个MapReduce作业并行地读或 写文件。各个文件在独立的map任务上被读或写,map任务的输出会产生一些计 对刚刚处理的文件的统计信息,reduce任务汇总这些统计信息,并产生一份总结报告。 以下命令写10个文件,各文件的大小为1000MB:
% hadoop jar $HADOOP_INSTALL/hadoop-*-test.jar TestDFSIO -write -nrFiles 10-fileSize 1000
运行结束之后,结果被同时写到控制台和一个本地文件之中。注意,是以添加的方 式写到本地文件中,因此当重新运行基准测试程序时不会丢失历史记录:
% cat TestDFSIO_results.log----- TestDFSIO ----- :write Date & time :Sun Apr 12 07:14:09 EDT 2009 Number of files :10 Total MBytes processed :10000 Throughput mb/sec :7.796340865378244 Average IO rate mb/sec :7.886219978BB25195 IO rate std deviation :0.9101254683525547 Test exec time sec :163.387
默认情况下,文件被写到io_data目录下的benchmarks/TestDFSIO子目录。可以通 过设置test.build.data系统属性来更改目录(仍旧在io_data目录)。 若想测试读操作,则需使用-read参数。注意,待读的文件必须已经存在(已通过 TestDFSIO〜write命令创建):
% hadoop jar $HADOOP_INSTALL/hadoop-*-test.jar TestDFSIO -read -nrFiles 10-fileSize 1000
以下内容是实际测试结果:
----- TestDFSIO ----- :read Date & time :Sun Apr 12 07:24:28 EDT 2009 Number of files :10 Total MBytes processed :10000 Throughput mb/sec :80.25553361904304 Average IO rate mb/sec :98.6801528930664 IO rate std deviation :36.63507598174921 Test exec time sec :47.624
测试结束之后,可以使用-clean参数删除所有在HDFS上临时生成的文件:
% hadoop jar $HADOOP_INSTALL/hadoop-*-test.jar TestDFSIO -clean
使用Sort程序测试MapReduce
Hadoop有一个MapReduce程序能够对输入数据做部分排序。鉴于整个输入数据集 是通过shuffle传输的,Sort程序对于整个MapReduce系统的基准测试很有帮助。 整个测试含三个步骤:随机产生一些数据、排序操作、验证结果。
首先,使用RandomWriter来产生随机数。该程序运行一个MapReduce作业,在 各节点上分别运行10个map任务,每个map任务大约产生10GB大小的随机二进 制数。键和值的大小可以不同。用户可以通过test.randomwriter.maps_per_host 和test.randomwrite.bytes_per_map这两个属性来改变每节点运行的map任 务数和毎map任务产生的数据量。其他一些设置还可修改键和值的取值范围,详 见 RandomWriter 的说明。
以下命令演示如何调Randomwriter(放在示例JAR文件中,而非测试JAR文件中)以向random-data目录输出数据:
% hadoop jar $HADOOP_INSTALL/hadoop-*-examples.jar randomwriter random-data
接下来,运行Sort程序:
% hadoop jar $HADOOP_INSTALL/hadoop-*-examples.jar sort random-data sorted-data
最后,还需要验证在sorted-data文件中的数据是否已经排好序了:
% hadoop jar $HADOOP_INSTALL/hadoop-*-test. jar testmapredsort -sortInput random-data \ -sortOutput sorted-data
该命令运行SortValidator程序来在未排序的的和已排序的数据上执行一系列检查, 以验证排序结果是否正确。最后,向控制台稂告以下输出结果:
SUCCESS! Validated the MapReduce framework's 'sort' successfully.
用户的作业
出于集群性能调优的目的,最好包含若干代表性强、使用频繁的作业。这样的话, 调优操作可以更有针对性,而非只是对通用场景调优。但如果待测试的集群是用户 搭建的第一个Hadoop集群,而且还没有代表性强的作业,则Gridmix仍不失为一 个好的测试方案。
基于这些典型作业进行测试时,还需要合理选择一个数据集合。这样的话,不管运 行多少次,作业始终运行在相同数据集合上,便于分析、比较性能变迁。当新建或 升级集群时,使用同一数据集合还可以用于比较新旧集群的性能。