hadoop 测试框架
hadoop 0.21以前的版本中(这里拿0.20为例,其他版本可能有少许不同),所有的测试相关代码都是放置在${HADOOP_HOME}/src/test下,在该目录下,是按照不同的目录来区分针对不同模块的测试代码。这里需要了解的是:对于相应的hadoop代码和class的包结构,在test中也是以相同的包结构来管理。比如,对于org.apache.hadoop.hdfs.server.namenode中的代码,其源码在src/hdfs/org/apache/hadoop/hdfs/server/namenode中,其测试用例的代码就位于:/src/test/org/apache/hadoop/hdfs/server/namenode内。其他模块以此类推。
测试用例结构
以hdfs为例,对于不需要集群环境的测试,其测试代码就跟寻常的单元测试代码一样,无非是程序级别的一些验证和assert,跟一般的测试用例代码没有什么区别。
MiniDFSCluster
若需要模拟HDFS集群环境,但有没有真是的集群情况下,hadoop测试代码中提供了一个MiniDFSCluster的类,这个类提供了一个本机单进程的hdfs集群环境,用来模拟对hdfs集群环境的模拟。在对该类进行初始化时,程序会根据构造函数参数来设置集群环境下相应的关键配置和参数设置,比如:dfs.name.dir,dfs.data.dir,fs.checkpoint.dir,fs.default.name(这里会设置为hdfs://localhost:port,相当于一个一台机器的hdfs分布式环境),同时会根据从参数获取的datanode数来初始化一些datanode,这样一个真实的分布式环境就能构建出来,如果对某项功能的测试中需要设置相应的namenode或datanode配置参数,只需对构造函数参数中的conf对象进行set即可。
Example
这里拿TestDFSRename用例来做example:
- 构建MiniDFSCluster环境,所以在testcase的setup()中如下初始化hdfs cluster
- 获取DistributeFileSystem实例:
- 编写自己的testRename()方法。
运行testcase
在IDE中调试运行
通常对于这种单元测试的testcase,都是可以在开发环境的IDE中直接运行,如下如所示:
回归
当要发布版本,或者编译新的hadoop版本的时候,可以在编译的同时进行回归测试,将所有相关的testcase全部运行一遍,看某些改动会不会影响到其他的模块的逻辑。这种情况下,可以通过ant来运行相应的target,以运行所有的用例测试。如下图所示:
这样,对target为test-core的所有用例,就会进行一次全部的回归,当所有的用例全部通过,就至少能够保证在已经预料到的情形下,目前的代码版本不会有什么问题了。每个case都会记录其全部的日志,日志记录的路径在: ${HADOOP_HOME}/build/test中,如下图所示:
这样对于出错的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中自带的一系列工具列表:
DFSCIOTest | Distributed i/o benchmark of libhdfs. |
DistributedFSCheck | Distributed checkup of the file system consistency. |
MRReliabilityTest | A program that tests the reliability of the MR framework by injecting faults/failures |
TestDFSIO | Distributed i/o benchmark. |
dfsthroughput | measure hdfs throughput |
filebench: | Benchmark SequenceFile(Input|Output)Format (block,record compressed and uncompressed), Text(Input|Output)Format (compressed and uncompressed) |
loadgen | Generic map/reduce load generator |
mapredtest | A map/reduce test check. |
minicluster | Single process HDFS and MR cluster. |
nnbench | A benchmark that stresses the namenode. |
testbigmapoutput | A map/reduce program that works on a very big non-splittable file and does identity map/reduce |
testfilesystem | A test for FileSystem read/write. |
testrpc | A test for rpc |
testsequencefile | A test for flat files of binary key value pairs. |
threadedmapbench: | A map/reduce benchmark that compares the performance of maps with multiple spills over maps with 1 spill |
单独运行每个工具,都会有详细的帮助信息输出到命令行,根据命令行提示,就可以对很多想要进行性能测试的模块进行压力和性能测试。每个工具最终都会输出一个统计结果。若要定制自定义的压力测试工具,可以自己动手编写相应的压力测试程序,然后注册到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框架都不存在问题。
在新的测试框架中,测试代码被放置在:
src/
test/
system/
test/
[org.apache.hadoop.hdfs|org.apache.hadoop.mapred]
中,而跟Framework相关的代码都位于org.apache.hadoop.test.system中,而HDFS和MR相关的Herriot测试代码,则分别位于org.apache.hadoop.hdfs.test.system, org.apache.hadoop.mapreduce.test.system中。
Example
这里以Herriot系统中真实的case src/test/system/test/org/apache/hadoop/mapred/TestCluster.java为例。
该用例中,从@BeforeClass开始,该before会创建一个cluster proxy的instance(在这里为一个mapreduce cluster),这个proxy能够让程序直接访问MapReduce的daemons进程(JT和TTs)。程序的第二行创建了mapreduce所有的daemon proxies,并通过Herriot library API让这些daemons进程都对测试程序可用。Herriot会保证测试环境是完全clean并且所有的内部daemons的状态都已经reset。不仅如此,所有daemons进程的log也都会被保存下来。这些log非常有用,可以让开发和测试人员方便定位问题。@BeforeClass会确保所有的testcase在运行时,只有一个cluster
proxy 的instance在服务。以避免冲突。
- 在测试中,要提交一个job到集群,也是非常简单的,如下:
新的JT API调用submitAndVerifyJob(Configuration conf)来检查提交的job是否已经成功完成。并会跟踪job运行的details(比如运行了多少map多少reduce),监控job的progress和成功与否,并执行相应的cleanup。如果任意一个过程中发生异常,测试框架将会抛出异常。
下列代码演示了如何修改一个集群的配置并将之重启的过程。随后又使用之前的配置再次进行重启。
1.1 测试用例执行环境
执行测试用例前,测试的client端需要满足如下条件:
l 能够访问某个已有的支持Herriot的hadoop集群
l 相应的hadoop配置文件目录(通常在$HADOOP_CONF_DIR下)
运行testcase的客户端并不需要hadoop的binary包,Herriot test是使用source code直接通过运行如下命令来执行。
ant test-system -Dhadoop.conf.dir.deployed=${HADOOP_CONF_DIR}
这样运行test-system,会将有的testcase全部执行一遍。如果只想运行其中某一个testcase,只需要运行时加上选项 –Dtestcase=testname 就可以了。
当test执行完以后,执行结果和日志都可以从 build-fi/system/test目录下找到。
通常,test client都是在cluster的gateway上,但执行test的client同样也可以是一台slave,笔记本等其他有权访问cluster的机器。
hadoop 测试框架的更多相关文章
- Hadoop Streaming框架学习(一)
Hadoop Streaming框架学习(一) Hadoop Streaming框架学习(一) 2013-08-19 12:32 by ATP_, 473 阅读, 3 评论, 收藏, 编辑 1.Had ...
- hadoop压缩框架
一般来说,计算机处理的数据都存在一些冗余度,同时数据中间,尤其是相邻数据间存在着相关性,所以可以通过一些有别于原始编码的特殊编码方式来保存数据,使数据占用的存储空间比较小,这个过程一般叫压缩.和压缩对 ...
- phpunit 测试框架安装
PHPUnit是一个轻量级的PHP测试框架.它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计).来自百度百科 一.下载wg ...
- 某互联网后台自动化组合测试框架RF+Sikuli+Python脚本
某互联网后台自动化组合测试框架RF+Sikuli+Python脚本 http://www.jianshu.com/p/b3e204c8651a 字数949 阅读323 评论1 喜欢0 一.**Robo ...
- selenium测试框架使用xml作为对象库
之前已经写过一篇: selenium测试框架篇,页面对象和元素对象的管理 上次使用的excel作为Locator对象管理,由于excel处理不够方便,有以下缺点: 不能实现分page 加载Locato ...
- selenium 测试框架中使用grid
之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecr ...
- selenium测试框架篇,页面对象和元素对象的管理
前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让 ...
- Junit测试框架 Tips
关于Junit测试框架使用的几点总结: 1.Junit中的测试注解: @Test →每个测试方法前都需要添加该注解,这样才能使你的测试方法交给Junit去执行. @Before →在每个测试方法执行前 ...
- Python几种常用的测试框架
一.测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过 ...
随机推荐
- Jetty 嵌入式启动官方完整教程
网上太多了,不如直接看官方的这个全面. http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty 入门地址: http://wiki.eclipse ...
- 【Android应用开发】Android Studio 简介 (Android Studio Overview)
一. Intelij IDEA 环境简介 Android Studio 来源 : Android Studio 是 Intelij IDEA 的免费版本 + Android SDK 集成的; -- I ...
- ENVI自带的非监督分类测试情况
最近写了两个关于遥感图像的简单的非监督分类算法KMEAN和ISODATA,发现结果和ENVI的一直有差异,而且还蛮大的,找了好久也没有找到原因.于是用PS自己绘制了一个简单的图像用于测试.如图1所示, ...
- kindeditor用法简单介绍
最近做毕业设计用了一个叫做kindeditor的文本编辑工具,相信很多人都用过,这货和fckeditor差不多,个人感觉这个的皮肤更好看,而且对中文的支持更好,没那么容易出现中文乱码问题.下次记录一下 ...
- 在Debian/Ubuntu系统中安装*.sh与*.bin文件
在Debian/Ubuntu系统中安装*.sh与*.bin文件的基本方法.一,安装*.sh文件运行命令行至文件目录下,执行:sudo sh *.sh直接运行在命令行中执行:sudo chmod +x ...
- springMVC源码分析--国际化LocaleResolver(一)
springMVC给我们提供了国际化支持,简单来说就是设置整个系统的运行语言,然后根据系统的运行语言来展示对应语言的页面,一般我们称之为多语言.springMVC国际化机制就是可以设置整个系统的运行语 ...
- 当图片验证码遇上JSP
今天看到了一个关于使用JSP方式生成图片验证码 的小例子,感觉真的是很不错,拿来分享一下. 原理 对于图片验证码,我们在审查元素的时候会方便的看出是<img src="#" ...
- python类:属性
http://blog.csdn.net/pipisorry/article/details/50708616 Python 中的 property 属性 Python中有个很赞的概念,叫做prope ...
- Html标签中thead、tbody、tfoot的作用
Html标签中thead.tbody.tfoot的作用 为了让大表格(table)在下载的时候可以分段的显示,就是说在浏览器解析HTML时,table是作为一个整体解释的,使用TBODY可以优化显示. ...
- LINUX0.11 内核阅读笔记
一.源码目录 图1 二.系统总体流程: 系统从boot开始动作,把内核从启动盘装到正确的位置,进行一些基本的初始化,如检测内存,保护模式相关,建立页目录和内存页表,GDT表,IDT表.然后进入main ...