hadoop mapreduce作业的最佳单元测试工具/方法

qmb5sa22  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(309)

我是新来的,但是我需要知道对用apachehadoop编写的程序进行单元测试的最佳方法。我知道我们可以用junit方式为map和reduce方法中的逻辑编写单元测试用例。我们也可以对涉及的其他逻辑执行相同的操作,但这不能保证它经过良好的测试,并且可以在实际的运行环境中工作。
我读过关于mrunit的文章,但它看起来也像我上面提到的那样,但是以一种更成熟的方式。但它也不是真正的mapreduce作业,而是一个模拟作业。
任何帮助都将不胜感激。
谢谢。

mm5n2pyu

mm5n2pyu1#

你当然还有其他选择。轻轻的谷歌一下,你就能自己搞定了。我是为你做的!
以下是我粘贴的文本:http://blog.cloudera.com/blog/2009/07/advice-on-qa-testing-your-mapreduce-jobs/
除了使用传统的junit和mrunit之外,您还有以下选项:

本地job runner测试—在单个jvm中在单个机器上运行mr jobs

传统的单元测试和mrunit应该在早期检测bug方面做得相当充分,但它们都不能用hadoop测试mr作业。本地job runner允许您在本地机器上的一个jvm中运行hadoop,从而使mr jobs在作业失败时更易于调试。
要启用本地作业运行程序,请将“mapred.job.tracker”设置为“local”,将“fs.default.name”设置为“file:///some/local/path”(这些是默认值)。
记住,在使用本地作业运行程序时,不需要启动任何hadoop守护程序。运行bin/hadoop将启动一个jvm并为您运行作业。创建一个新的hadoop-local.xml文件(或者mapred-local.xml和hdfs-local.xml,如果您使用的是0.20)可能是有意义的。然后可以使用–config参数告诉bin/hadoop要使用哪个配置目录。如果您希望避免摆弄配置文件,可以创建一个实现工具并使用toolrunner的类,然后使用bin/hadoop jar foo.jar com.example.bar-d mapred.job.tracker=local-d fs.default.name=file://(args)运行这个类,其中bar是工具实现。
要开始使用本地job runner在hadoop中测试mr作业,请创建一个启用了本地job runner的新配置目录,并像平常一样调用作业,记住要包含–config参数,该参数指向包含本地配置文件的目录。
-conf参数也适用于0.18.3,允许您指定hadoop-local.xml文件,而不是使用–config指定目录。hadoop将愉快地运行作业。这种测试形式的困难在于验证作业是否正确运行。注意:在运行作业之前,必须确保输入文件设置正确,并且输出目录不存在。
假设您已成功配置本地作业运行程序并运行了一个作业,则必须验证作业是否正确完成。仅仅把成功建立在退出代码上是不够的。至少,您需要验证作业的输出是否正确。您可能还希望扫描bin/hadoop的输出以查找异常。您应该创建一个脚本或单元测试,用于设置前提条件、运行作业、区分实际输出和预期输出,以及扫描引发的异常。然后,此脚本或单元测试可以以适当的状态退出,并输出解释作业如何失败的特定消息。
注意,本地job runner有几个限制:只支持一个reducer,distributedcache不工作(正在修复)。

伪分布式测试——使用守护程序在一台机器上运行mr作业

本地job runner允许您在单个线程中运行作业。在单个线程中运行mr作业对于调试很有用,但是它不能正确地模拟运行多个hadoop守护进程的真实集群(例如namenode、datanode、tasktracker、jobtracker、secondarynamenode)。伪分布式集群由一台运行所有hadoop守护进程的机器组成。这个集群仍然相对容易管理(尽管比本地job runner更难),并且比本地job runner更好地测试与hadoop的集成。
要开始使用伪分布式集群来测试hadoop中的mr作业,请遵循前面提到的使用本地作业运行器的建议,但在前提条件设置中包括所有hadoop守护进程的配置和启动。然后,要开始你的工作,只需要像平常一样使用bin/hadoop。

完全集成测试—在qa集群上运行mr作业

测试mr作业最彻底但最麻烦的机制可能是在至少由几台机器组成的qa集群上运行它们。通过在qa集群上运行mr作业,您将测试作业及其与hadoop的集成的所有方面。
在qa集群上运行作业与本地作业运行程序有许多相同的问题。也就是说,您必须检查作业的输出是否正确。您可能还希望扫描每个任务尝试产生的stdin和stdout,这将需要将这些日志收集到一个中心位置,并将它们进行灰显。scribe是收集日志的有用工具,尽管它可能是多余的,这取决于qa集群。
我们发现,我们的大多数客户都有某种qa或开发集群,他们可以在其中部署和测试新作业,尝试更新版本的hadoop,并练习将集群从一个版本的hadoop升级到另一个版本。如果hadoop是生产流水线的主要部分,那么创建qa或开发集群是非常有意义的,在它上反复运行作业将确保对作业的更改继续得到彻底的测试。ec2可能是qa集群的一个很好的主机,因为您可以根据需要上下调整它。如果您对在ec2中创建qa集群感兴趣,请查看我们的beta ec2 ebs hadoop脚本。
您应该根据qa对您的组织的重要性以及您拥有的资源量来选择qa实践。只需使用传统的单元测试框架,mrunit和本地job runner就可以以一种简单的方式彻底测试mr作业,而不需要使用太多的资源。然而,在qa或开发集群上运行作业自然是用hadoop集群的开销和操作任务来全面测试mr作业的最佳方法。

相关问题