2012-03-18 84 views
4

我在新的Hadoop版本中遇到了MultithreadedMapper类,文档说它可以用来代替传统的(单线程)映射器类。 但我没有遇到任何使用这个新类的演示示例。 另外,我会更乐意使用setNumberOfThreads()方法。 使用它的任何代码示例?如何在Hadoop Mapreduce中使用MultithreadedMapper类?

预先感谢您

回答

8

一小段代码:

Configuration conf = new Configuration(); 
Job job = new Job(conf); 
job.setMapperClass(MultithreadedMapper.class); 
conf.set("mapred.map.multithreadedrunner.class", WebGraphMapper.class.getCanonicalName()); 
conf.set("mapred.map.multithreadedrunner.threads", "8"); 
job.setJarByClass(WebGraphMapper.class); 
// rest ommitted 
job.waitForCompletion(true); 

我认为这是相当自我解释。您使用多线程映射器作为主类,然后配置它必须运行的类(您的真实映射器)。 也有这些便利的静态方法,为你做这个配置的东西。一个电话可能是这样的:

MultithreadedMapper.setMapperClass(job, WebGraphMapper.class); 
MultithreadedMapper.setNumberOfThreads(job, 8); 
+0

我试过了,但我得到的输出是不一致的。这些线程并不是单独处理每个输入记录,也就是说某些线程在同一条记录上工作,输出是冗余的:( – Harsh 2012-03-19 08:47:46

+0

然后你在代码中声明了一些静态的东西,对我来说这是正确的(版本0.20 0.2)。 – 2012-03-19 08:58:42