如何使用hdfs测试hadoop mapreduce?

时间:2015-09-02 17:06:46

标签: hadoop hdfs mrunit

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

但是,我遇到麻烦,包括hdfs。我的MR工作需要来自hdfs的文件。如何在MRUnit测试用例中模拟出hdfs部分?

编辑:

我知道我可以在测试基础架构中为我的MR代码指定输入/ exepctedOutput。但是,这不是我想要的。我的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));
}

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

1 个答案:

答案 0 :(得分:0)

请按照这个关于MRUnit的小教程。

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

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