2016-03-04 52 views
2

我試圖用this運行與常規的例子的wordCount但遇到錯誤運行的wordCount的Hadoop例如使用Groovy

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

發現this上面的錯誤,但在我的設置中無法找到pom.xml文件。

然後我遇到this。我們如何在hadoop中運行它。它是通過使一個jar文件,類似於Java示例運行?(其中細跑)

是什麼運行使用groovy-hadoop一個常規例子之間,並通過使用this文件(不知道如何運行此)和hadoop-streaming的區別?爲什麼我們會用其中一種方法。

我已經安裝了Hadoop的2.7.1在Mac 10.10.3

回答

2

我能夠運行this常規文件用Hadoop 2.7.1 我遵循的程序是

  1. 安裝gradle這個
  2. 使用gradle這個生成jar文件。我問this問題這幫助我建立依賴於使用Hadoop和往常一樣gradle這個
  3. 運行方式運行,我們使用這個命令從那裏JAR所在的文件夾一個java jar文件。

    hadoop jar buildSrc-1.0.jar in1 out4

其中in1是輸入文件,並out4是HDFS

編輯 -正如上面的鏈接壞了,我在這裏粘貼常規文件輸出文件夾。

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); 
     } 
    } 
} 
0

您使用,Groovy的Hadoop的圖書館,表示支持的Hadoop 0.20.2。這真的很老。

但是您試圖運行的代碼CountGroovyJob.groovy看起來應該在Hadoop的版本2.x.x上運行。 我可以,因爲你看到的軟件包,如org.apache.hadoop.mapreduce.Mapper進口看到這一點,而2.0版本之前,它被稱爲org.apache.hadoop.mapred.Mapper

在SO問題,你聯繫最投票的答案可能是你所需要的答案。您遇到不兼容問題。 groovy-hadoop庫不能用於你的Hadoop 2.7.1。

+0

感謝。大多數投票答案要求我們更新pom.xml,但它在哪裏。我看'/ usr/local/Cellar/hadoop/2.7.1/libexec/etc/hadoop'。還查看'/ usr/local/Cellar/hadoop/2.7.1/libexec/sbin',但找不到。另外,任何想法如何運行我鏈接到的groovy文件? – user1207289

+0

pom.xml是構建庫的Maven配置文件。這是舊圖書館的作者用於構建網站上可用的罐子的方式。不幸的是,它看起來像他沒有分享他的源代碼(我無法找到它),所以你不能修改該pom.xml並重建/修復它。 – Nicomak

相關問題