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

时间:2012-12-18 16:52:26

标签: unit-testing hadoop mapreduce

我是新来的,但需要知道对通过Apache Hadoop编写的程序进行单元测试的最佳方法。我知道我们可以用jUnit方式编写单元测试用例,用于map中的逻辑和reduce方法。此外,我们也可以对其他逻辑进行相同的操作,但这并不能保证它经过良好测试,并且可以在实际运行环境中运行。

我已经阅读过关于MRUnit的内容,但它似乎也像我上面提到的那样,但是更加成熟。但它也不是真正的mapreduce工作,而是一个嘲弄的工作。

任何帮助都将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:3)

你当然还有其他选择。轻微的谷歌搜索,你会得到它自己。我在这里为你做到了!

以下是我粘贴的文字:http://blog.cloudera.com/blog/2009/07/advice-on-qa-testing-your-mapreduce-jobs/

除了使用传统的jUnit和MRUnit之外,您还有以下选项:

本地作业运行程序测试 - 在单个JVM中的单台计算机上运行MR作业

传统的单元测试和MRUnit应该尽早完成检测错误的工作,但是不会用Hadoop测试你的MR工作。本地作业运行器允许您在本地计算机上运行Hadoop,在一个JVM中,在作业失败的情况下使MR作业更容易调试。

要启用本地作业运行器,请将“mapred.job.tracker”设置为“local”,将“fs.default.name”设置为“file:/// some / local / path”(这些是默认值)

请记住,使用本地作业运行器时无需启动任何Hadoop守护程序。运行 bin / hadoop 将启动JVM并为您运行工作。创建一个新的hadoop-local.xml文件(如果使用0.20,则为mapred-local.xml和hdfs-local.xml)可能有意义。然后,您可以使用 -config 参数告诉 bin / hadoop 使用哪个配置目录。如果您宁愿避免摆弄配置文件,可以创建一个实现Tool并使用ToolRunner的类,然后使用 bin / hadoop jar foo.jar com.example运行此类.Bar -D mapred.job.tracker = local -D fs.default.name = file:///(args),其中 Bar 是工具实现。

要开始使用本地作业运行器在Hadoop中测试MR作业,请创建一个新的配置目录,该目录启用本地作业运行器并像往常一样调用您的作业,记住要包含 -config 参数,指向包含本地配置文件的目录。

-conf 参数也适用于0.18.3,并允许您指定hadoop-local.xml文件,而不是使用 -config 指定目录。 Hadoop将愉快地开展工作。这种形式的测试的困难在于验证作业是否正确运行。注意:在运行作业之前,您必须确保输入文件设置正确并且输出目录不存在。

假设您已设法配置本地作业运行器并运行作业,则必须验证您的作业是否正确完成。简单地在退出代码上取得成功并不是很好。至少,您需要验证作业的输出是否正确。您可能还想扫描 bin / hadoop 的输出以查找异常。您应该创建一个脚本或单元测试来设置前提条件,运行作业,区分实际输出和预期输出,以及扫描引发的异常。然后,此脚本或单元测试可以以适当的状态退出,并输出解释作业失败方式的特定消息。

请注意,本地作业运行器有一些限制:仅支持一个reducer,而DistributedCache不起作用(a fix is in progress)。

伪分布式测试 - 使用守护进程在单台机器上运行MR作业

本地作业运行器允许您在单个线程中运行作业。在单个线程中运行MR作业对于调试很有用,但它无法正确模拟运行多个Hadoop守护程序的实际集群(例如, NameNode,DataNode,TaskTracker,JobTracker,SecondaryNameNode)。伪分布式集群由运行所有Hadoop守护程序的单个计算机组成。这个集群仍然相对容易管理(虽然比本地工作者更难)并且测试与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群集感兴趣,请查看我们的测试版EC2 EBS Hadoop scripts

您应该根据您的组织的质量保证的重要性以及您拥有的资源数量来选择质量保证实践。简单地使用传统的单元测试框架,MRUnit和本地作业运行器可以在不使用太多资源的情况下以简单的方式彻底测试MR作业。但是,在QA或开发集群上运行作业自然是使用Hadoop集群的费用和操作任务完全测试MR作业的最佳方法。