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:

  1. 构建MiniDFSCluster环境,所以在testcase的setup()中如下初始化hdfs cluster

  2. 获取DistributeFileSystem实例:

  3. 编写自己的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 测试框架的更多相关文章

  1. Hadoop Streaming框架学习(一)

    Hadoop Streaming框架学习(一) Hadoop Streaming框架学习(一) 2013-08-19 12:32 by ATP_, 473 阅读, 3 评论, 收藏, 编辑 1.Had ...

  2. hadoop压缩框架

    一般来说,计算机处理的数据都存在一些冗余度,同时数据中间,尤其是相邻数据间存在着相关性,所以可以通过一些有别于原始编码的特殊编码方式来保存数据,使数据占用的存储空间比较小,这个过程一般叫压缩.和压缩对 ...

  3. phpunit 测试框架安装

    PHPUnit是一个轻量级的PHP测试框架.它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计).来自百度百科 一.下载wg ...

  4. 某互联网后台自动化组合测试框架RF+Sikuli+Python脚本

    某互联网后台自动化组合测试框架RF+Sikuli+Python脚本 http://www.jianshu.com/p/b3e204c8651a 字数949 阅读323 评论1 喜欢0 一.**Robo ...

  5. selenium测试框架使用xml作为对象库

    之前已经写过一篇: selenium测试框架篇,页面对象和元素对象的管理 上次使用的excel作为Locator对象管理,由于excel处理不够方便,有以下缺点: 不能实现分page 加载Locato ...

  6. selenium 测试框架中使用grid

    之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecr ...

  7. selenium测试框架篇,页面对象和元素对象的管理

    前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让 ...

  8. Junit测试框架 Tips

    关于Junit测试框架使用的几点总结: 1.Junit中的测试注解: @Test →每个测试方法前都需要添加该注解,这样才能使你的测试方法交给Junit去执行. @Before →在每个测试方法执行前 ...

  9. Python几种常用的测试框架

    一.测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过 ...

随机推荐

  1. Makefile自动生成

    automake/autoconf入门作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile ...

  2. achartengine之折线图

    问题在文章的最后,大致说来就是折线图,如果点的个数大于3个的时候,不是所有的点都显示对应的值的,这是为什么呢,本来以为是小问题,但两天了还没找到原因) 将前两天的折线图代码做了小量修改,形成一个类似于 ...

  3. Java基础---Java---IO流-----对象的序列化、管道流、RandomAccessFile、数据类型的流对象DataStream、ByteArrayStream

    ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream ...

  4. 简单RPC实现之Netty实现

    所谓RPC就是远程方法调用(Remote  Process Call ),简单的来说就是通过MQ,TCP,HTTP或者自己写的网络协议来传输我要调用对方的什么接口,对方处理之后再把结果返回给我.就这么 ...

  5. 05 Android强制设置横屏或竖屏/全屏

    全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...

  6. Xdoclet + Ant自动生成Hibernate配置文件

    在使用Hibernate的时候,过多的Hibernate配置文件是一个让人头疼的问题.最近接触了Xdoclet这个工具.它实际上就是一个自动代码生成的工具,Xdoclet不能单独运行,必须搭配其他工具 ...

  7. Hessian源码分析--HessianProxy

    在上一篇博客 Hessian源码分析--HessianProxyFactory 中我们了解到,客户端获得的对象其实是HessianProxy生成的目标对象,当调用目标对象的方法时,会调用Hessian ...

  8. 【一天一道LeetCode】#122. Best Time to Buy and Sell Stock II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Say you ...

  9. UNIX环境高级编程——IPC总结

    IPC主要包括:管道,消息队列,信号量,共享内存, 套接字(SOCKET). 一.IPC对象的持久性 每种IPC机制都会借助一种数据结构,这种数据结构的实例称为该IPC机制的对象(相应的,用于同步互斥 ...

  10. 存储那些事儿(二): 下一代Linux文件系统BTRFS简介

    BTRFS,通常念成 Butter FS,Better FS 或B-tree FS.下一代的Linux文件系统. 它基于写时拷贝(copy-on-write),支持高效的snapshot和clone. ...