最近项目需要用到MapReduce进行一个需求开发,对于一个初学者来说,任何入门的知识都可以通过www.baidu.com获取。但是,百度并不能够帮我们百分百的理解原理性的东西,因为任何一个框架、插件、源代码,并不仅仅是System.out.print("Hello World !");这么简单。
通过mrunit,可以帮助我们做mapreduce的单元测试,验证程序以及代码逻辑,what`s more,还对我们理解mapreduce有很大的帮助。
首先,我是在https://my.oschina.net/cloudcoder/blog/285151初步了解MapReduceDriver的使用,了解完之后,再来说说我在使用mrunit的一点心得。
在我的MapReduce程序中,需要做全局数据共享,可了解DistributedCache,在新的hadoop版本中,已经集成到job里,直接调用addCacheFile即可实现文件共享(文件在hdfs上面);而全局变量共享,通过 Configuration 的set函数即可实现。
对于mrunit,回调用到mapper.class的set跟map函数,所以MapReduceDriver也要将共享文件通过addCacheFile传到mapper.class的set函数中。代码如下:
MapReduceDriver<LongWritable, Text, Text, Text, Text, Text> mapReduceDriver = MapReduceDriver.newMapReduceDriver(new Mapper(), new Reducer());
Configuration conf = new Configuration();
conf.set("args[0]", "1");
// 必须先setConfiguration,再addCacheFile
mapReduceDriver.setConfiguration(conf);
mapReduceDriver.addCacheFile("sample.txt");前期工作准备好之后,就可以对map的输入输出进行单元测试。
输入可以通过MapReduceDriver的withInput函数实现。
输出的预期结果可以通过MapReduceDriver的withOutput函数实现。
最后,要调用MapReduceDriver的runTest运行。示例代码如下:
mapReduceDriver.withInput(new LongWritable(),
new Text("benjarmin,jack,benjarmin"));
mapReduceDriver.withOutput(new Text("benjarmin"),new Text("2"));
mapReduceDriver.withOutput(new Text("jack"),new Text("1"));
mapReduceDriver.runTest();