大数据分析之Hadoop现有测试框架探幽

回归

当要发布版本,或者编译新的hadoop版本的时候,可以在编译的同时进行回归测试,将所有相关的testcase全部运行一遍,看某些改动会不会影响到其他的模块的逻辑。这种情况下,可以通过ant来运行相应的target,以运行所有的用例测试。如下图所示:

36大数据22

这样,对target为test-core的所有用例,就会进行一次全部的回归,当所有的用例全部通过,就至少能够保证在已经预料到的情形下,目前的代码版本不会有什么问题了。每个case都会记录其全部的日志,日志记录的路径在: ${HADOOP_HOME}/build/test中,如下图所示:

36大数据33

这样对于出错的testcase,就可以找到相应的出错日志,查看为什么case会失败,进而发现代码修改引发的其他问题。
 
随着testcase的增多,运行一次完整的回归可能需要花费很长的时间,长的话可能需要好几个小时。所以如果希望在ant模式下运行单独的testcase,也是可以的,可以通过
 
ant –Dtestcase=${casename} test-core
 
就可以了,其中casename为测试用例的name,例如TestDFSRename。
 
一些测试工具
 
我们常常需要对HDFS或者mapreduce进行一些性能方面的测试,比如测试rpc的性能,测试DFS的IO读写性能,测试DFS的吞吐率性能,测试namenode的benchmark性能,mapreduce的sort性能等等。在hadoop的发行版中,其实已经提供了许多类似的工具,并已经打包成jar,供我们使用。以下是0.20.2中自带的一系列工具列表:

单独运行每个工具,都会有详细的帮助信息输出到命令行,根据命令行提示,就可以对很多想要进行性能测试的模块进行压力和性能测试。每个工具最终都会输出一个统计结果。若要定制自定义的压力测试工具,可以自己动手编写相应的压力测试程序,然后注册到org.apache.hadoop.test.AllTestDriver中。如想要了解每个benchmark工具的细节,可以从AllTestDriver中找到相应的测试工具的代码。
 
总结

可以看出,hadoop发行版中的测试环境已经非常丰富,对于模拟集群环境的类,工具等都已经有不少了。这些代码和工具对于程序开发者来说,非常有用。要编写新的测试代码,添加新的测试用例,也都非常方便。对于避免程序修改引起其他的相关问题等,都非常有效。
 
但是,可以看出,除了一些测试工具外,很多的测试用例都是运行在模拟环境中,并没有针对真实的集群环境进行的相关测试框架。这种缺陷的原因在于,许多的测试用例是需要对hadoop集群的daemon进程进行个性化的设置,这样就造成对集群需要个性化的启停,重启操作,而0.20之前还没有通过java API来实现在测试用例中方便的对真实的集群进行reconfiguration,restart的功能,必须要有外围的人工和脚本的介入。而一旦需要外围人工和脚本的介入,许多的测试就无法达到自动化的效果。所以,从0.21开始,hadoop发行版中引入了一个新的Large-Scale Automated Test Framework(HADOOP-6332)。
 
0.21开始的版本
从0.21开始,hadoop发行版中引入了一个新的测试框架,Large-Scale Automated Test Framework,该框架跟以前的测试框架不同之处在于,基于它之上的测试的开发是基于真正的集群环境的系统层面的,取名叫做Herriot。
 
Herriot测试框架最大的特点在于,可以通过Herriot中提供的对HDFS或者MR系统的API,来直接启动,停止,重启一个真实的hadoop集群,并能够保证每次case的运行都是在一个全新的集群执行环境中。这样能够达到的效果就是,通过java代码的testcase,就能够完成所有真实集群环境的自动化测试,而不需要额外的人工和外围脚本的介入。
 
目录结构

Herriot使用的是JUnit4的框架,JUnit关键的一些fixtures都会在Herriot框架中被用到。如@Before, @After等。所以对于测试的开发人员而言,Herriot测试框架其实就是JUnit的测试用例编程。所以,熟悉JUnit测试用例开发的人,使用Herriot框架都不存在问题。

更多详细信息,请您微信关注“计算网”公众号: