0

我正在使用 MRUnit 为我的 mapreduce 作业编写单元测试。

但是,我在将 hdfs 包含在该组合中时遇到了麻烦。我的 MR 工作需要来自 hdfs 的文件。如何模拟 MRUnit 测试用例中的 hdfs 部分?

编辑:

我知道我可以在测试基础设施中为我的 MR 代码指定输入/执行输出。然而,这不是我想要的。我的 MR 工作需要读取另一个具有域数据的文件才能完成这项工作。该文件位于 HDFS 中。我如何模拟这个文件?

我尝试使用 mockito,但它没有用。原因是 FileSystem.open() 返回一个 FSDataInputStream,它继承自 java.io.Stream 之外的其他接口。模拟所有接口太痛苦了。所以,我通过执行以下操作在我的代码中破解了它

if (System.getProperty("junit_running") != null)
{
    inputStream = this.getClass().getClassLoader().getResourceAsStream("domain_data.txt");
    br = new BufferedReader(new InputStreamReader(inputStream));
} else {
    Path pathToRegionData = new Path("/domain_data.txt");

    LOG.info("checking for existence of region assignment file at path: " + pathToRegionData.toString());

    if (!fileSystem.exists(pathToRegionData))
    {
        LOG.error("domain file does not exist at path: " + pathToRegionData.toString());
        throw new IllegalArgumentException("region assignments file does not exist at path: " + pathToRegionData.toString());
    }

    inputStream = fileSystem.open(pathToRegionData);

    br = new BufferedReader(new InputStreamReader(inputStream));
}

这个解决方案并不理想,因为我必须将测试特定代码放在我的生产代码中。我还在等着看是否有一个优雅的解决方案。

4

1 回答 1

0

请遵循 MRUnit 的这个小教程。

https://github.com/malli3131/HadoopTutorial/blob/master/MRUnit/Tutorial

在 MRUnit 测试用例中,我们在 testMapper() 和 testReducer() 方法中提供数据。所以 MRUnit Job 不需要来自 HDFS 的输入。只有 MapReduce 作业需要来自 HDFS 的数据输入。

于 2015-09-02T19:36:03.383 回答