我试图使用this使用groovy运行wordCount示例,但遇到错误
Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected
发现this表示上述错误,但无法在我的设置中找到pom.xml文件。
然后我遇到了this。我们如何在hadoop中运行它。是通过制作一个jar文件并像java示例一样运行吗?(运行正常)
使用groovy-hadoop
运行groovy示例和使用this文件(不确定如何运行)和hadoop-streaming
之间有什么区别?为什么我们会使用一种方法而不是其他方法。
我在mac 10.10.3上安装了hadoop 2.7.1
答案 0 :(得分:2)
我能够使用hadoop 2.7.1运行this 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);
}
}
}
答案 1 :(得分:0)
您正在使用的库groovy-hadoop表示它支持Hadoop 0.20.2
。它真的很老了。
但是您尝试运行的CountGroovyJob.groovy
代码似乎应该在Hadoop的2.x.x
版本上运行。
我可以看到这一点,因为在导入中您会看到org.apache.hadoop.mapreduce.Mapper
之类的包,而在版本2之前,它被称为org.apache.hadoop.mapred.Mapper
。
您链接的SO问题中投票最多的答案可能就是您需要的答案。您有不兼容问题。 groovy-hadoop库无法使用您的Hadoop 2.7.1。