我试图用运行使用Groovy的例子的wordCount这却遇到了错误
Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected
发现这上面的错误,但在我的设置无法找到pom.xml文件。
然后我遇到了这个。我们如何在hadoop中运行它。是通过制作一个jar文件并以与Java示例类似的方式运行吗?
使用groovy-hadoop
和通过使用此文件来运行groovy示例(不确定如何运行)和有hadoop-streaming
什么区别?为什么我们要使用一种方法胜过其他方法。
我已经在Mac 10.10.3上安装了hadoop 2.7.1
我能够使用hadoop 2.7.1运行该groovy文件。我遵循的过程是
像往常一样使用hadoop运行,就像我们从jar所在的文件夹中使用此命令运行Java jar文件一样。
hadoop jar buildSrc-1.0.jar in1 out4
这里in1
是输入文件,out4
是hdfs中的输出文件夹
编辑-由于上面的链接已损坏,我将groovy文件粘贴到此处。
import StartsWithCountMapper
import StartsWithCountReducer
import org.apache.hadoop.conf.Configured
import org.apache.hadoop.fs.Path
import org.apache.hadoop.io.IntWritable
import org.apache.hadoop.io.LongWritable
import org.apache.hadoop.io.Text
import org.apache.hadoop.mapreduce.Job
import org.apache.hadoop.mapreduce.Mapper
import org.apache.hadoop.mapreduce.Reducer
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat
import org.apache.hadoop.util.Tool
import org.apache.hadoop.util.ToolRunner
class CountGroovyJob extends Configured implements Tool {
@Override
int run(String[] args) throws Exception {
Job job = Job.getInstance(getConf(), "StartsWithCount")
job.setJarByClass(getClass())
// configure output and input source
TextInputFormat.addInputPath(job, new Path(args[0]))
job.setInputFormatClass(TextInputFormat)
// configure mapper and reducer
job.setMapperClass(StartsWithCountMapper)
job.setCombinerClass(StartsWithCountReducer)
job.setReducerClass(StartsWithCountReducer)
// configure output
TextOutputFormat.setOutputPath(job, new Path(args[1]))
job.setOutputFormatClass(TextOutputFormat)
job.setOutputKeyClass(Text)
job.setOutputValueClass(IntWritable)
return job.waitForCompletion(true) ? 0 : 1
}
static void main(String[] args) throws Exception {
System.exit(ToolRunner.run(new CountGroovyJob(), args))
}
class GroovyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable countOne = new IntWritable(1);
private final Text reusableText = new Text();
@Override
protected void map(LongWritable key, Text value, Mapper.Context context) {
value.toString().tokenize().each {
reusableText.set(it)
context.write(reusableText,countOne)
}
}
}
class GroovyReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
private IntWritable outValue = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Reducer.Context context) {
outValue.set(values.collect({it.value}).sum())
context.write(key, outValue);
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句