用groovy运行hadoop wordCount示例

时间:2016-03-04 15:19:16

标签: java hadoop groovy hadoop2 hadoop-streaming

我试图使用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

2 个答案:

答案 0 :(得分:2)

我能够使用hadoop 2.7.1运行this groovy文件 我遵循的程序是

  1. 安装gradle
  2. 使用gradle生成jar文件。我问了this问题,这个问题帮助我在gradle中构建了依赖关系
  3. 像往常一样运行hadoop,因为我们使用jar命令所在的文件夹运行java jar文件。

    hadoop jar buildSrc-1.0.jar in1 out4

  4. 其中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。