运行 hadoop wordCount 示例 groovy

running hadoop wordCount example with groovy

我正在尝试 运行 使用 this groovy 的 wordCount 示例,但遇到错误

Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected

发现 this 以上错误,但无法在我的设置中找到 pom.xml 文件。

然后我遇到了this。我们如何 运行 在 hadoop 中做到这一点。是通过制作一个 jar 文件和 运行 类似于 java 示例吗?(运行 很好)

运行使用 groovy-hadoop 和使用 this 文件 运行 一个 groovy 示例有什么区别(不知道如何 运行 这个) hadoop-streaming?为什么我们要使用一种方法而不是其他方法。

我已经在 mac 10.10.3

上安装了 hadoop 2.7.1

您正在使用的库 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 一起使用。

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

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

    hadoop jar buildSrc-1.0.jar in1 out4

其中 in1 是输入文件,out4 是 hdfs 中的输出文件夹

EDIT- 由于上面的 link 已损坏,我将 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);
        }
    }
}