使用MRUnit进行Hadoop测试

Pau*_*l W 9 unit-testing hadoop

我正在改进一系列现有的Hadoop单元测试,这些测试先前在内存集群(使用MiniMRCluster)中运行到MRUnit中.现有的测试用例主要为Map阶段提供输入,然后测试Reduce阶段的输出.

我有三个问题,其中任何一个的最佳答案都符合条件:

1)通过使用MRUnit而不是内存中的集群进行单元测试,我在架构上会失去什么?

2)是否值得将现有的测试用例分解为仅Map测试和仅Reduce测试?有什么情况我不得不打破它们吗?

3)MRUnit无法覆盖任何测试场景吗?

Pau*_*l W 10

改造过程给了我一些潜在的答案,我将在这里发布.我仍然宁愿听别人说的话,所以我不接受这个答案.

1)我至少失去了两件事.首先,MR管道被嘲笑.因此,有些"嘲弄"可能会隐藏MR工作中可能存在的问题.其次,除了在map和reduce阶段之间进行分区和排序之外,MR作业还包括来自文件系统的输入和到文件系统的输出.MRUnit并没有完全处理Hadoop的这些方面,因此如果MR作业依赖于这些功能,则无法对它们进行测试.不过,仍然可以重写测试来测试Map/Reduce部件.

2)在大多数情况下,打破现有测试是不值得的.例如,如果现有测试依赖于分区程序,那么分解测试可能是有意义的,这样可以在不涉及分区程序的情况下测试Map和Reduce.但总的来说,"做这件事"并不值得做.

3)是 - 一个分区.另一种输出格式.对于某些人来说,这可能不是什么大不了的事,但是我们现有的许多工作都依赖于这两个特性,并且由于单元测试与输出格式的最终​​输出相反,我不得不重写相当多的测试让他们工作.

[编辑]

刚刚从Cloudera上阅读了一篇博文,其中也提到了答案:

http://www.cloudera.com/blog/2009/07/debugging-mapreduce-programs-with-mrunit/