2014-12-01 2 views
0

Моего WordCount примерома является следующей структурой:Hadoop setJarByClass не работает

public class WordCount extends Configured implements Tool { 

    public static class Map extends 
      Mapper<LongWritable, Text, Text, IntWritable> {} 

    public static class Reduce extends 
      Reducer<Text, IntWritable, Text, IntWritable> {} 

    public static void main(String[] args) throws Exception { 
     BasicConfigurator.configure(); 
     Logger.getRootLogger().setLevel(Level.WARN); 
     int res = ToolRunner.run(new Configuration(), new WordCount(), args); 
     System.exit(res); 
    } 

    @Override 
    public int run(String[] args) throws Exception { 

     Configuration conf = new Configuration(); 
     FileSystem fs = FileSystem.get(conf); 

     if (fs.exists(new Path(args[1]))) { 
      fs.delete(new Path(args[1]), true); 
     } 

     Job job = Job.getInstance(conf, "wordcount"); 
     long startTime = System.currentTimeMillis(); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(IntWritable.class); 

     job.setMapperClass(Map.class); 
     job.setReducerClass(Reduce.class); 

     job.setInputFormatClass(TextInputFormat.class); 
     job.setOutputFormatClass(TextOutputFormat.class); 

     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 
     job.setJarByClass(WordCount.class); 
//  job.setJar(WordCount.class.getSimpleName()); 
     job.waitForCompletion(true); 
     System.out.println("Job Finished in " 
       + (System.currentTimeMillis() - startTime)/1000.0 
       + " seconds"); 
     return 0; 
    } 

} 

job.setJarByClass() вызова не работает, и я получаю сообщение «Нет работу банки набора файлов». Кроме того, job.getJar() после этого вызова показывает значение «null». Кто-нибудь знает, в чем проблема?

Я также пробовал с job.setJarByClass(this.getClass()), job.setJar("WordCount") и job.setJar(WordCount.class.getSimpleName()). Первый не имеет никакого эффекта, job.getJar() возвращает null, второй и третий оба дают мне FileNotFoundException: Файл WordCount не существует. Затем я пробовал с job.setJar("src/wordcount/WordCount.java") и job.setJar("bin/wordcount/WordCount.class"), оба успешно выполняются в затмении (без этого предупреждающего сообщения), но все равно с FileNotFoundException выполняются как автономный файл jar в командной строке. Я думаю, проблема может относиться к настройке пути к классу, если не неразрешенные зависимости.

ответ

1

Думаю, вы должны добавить соответствующие файлы jar.

В вашем случае вы должны иметь эту банку org.apache.hadoop.mapreduce.Job в своем файле проекта.

Я импортировал следующие классы и интерфейсы

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.FileSystem; 
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.Mapper.Context; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 
import org.apache.log4j.BasicConfigurator; 
import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 

и ваш проект работает отлично. Просто проверьте после импорта всех вышеперечисленных классов. Если возникнут какие-либо проблемы, дайте мне комментарий.

+0

Не могли бы вы подробнее рассказать обо всех необходимых зависимостях? В настоящее время у меня есть следующая запись зависимости maven: hasoop-common, hasoop-mapreduce-client-core, hasoop-mapreduce-client-jobclient, hasoop-mapreduce-client-shuffle (все с версией 2.2.0) и моя версия Java составляет 1,7,0_25. –

+0

добавить jar из ** hadoop-2.x.x/share/hadoop/common/lib ** log4j-1.2.x.jar файл. Попробуйте это, это может сработать. –

+0

И все jar из ** hadoop-2.xx/share/hadoop/mapreduce ** –

0

используйте этот код java для подсчета слов, с двумя аргументами один входной файл другой является файлом результата. И добавить все архивы из mapreduce и common папки в каталоге Hadoop

package org.samples.mapreduce.training; 

import java.io.IOException; 
import java.util.*;  
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapreduce.*; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;  
public class WordCount { 
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> { 
    private final static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
     String line = value.toString(); 
     StringTokenizer tokenizer = new StringTokenizer(line); 
     while (tokenizer.hasMoreTokens()) { 
      word.set(tokenizer.nextToken()); 
      context.write(word, one); 
     } 
    } 
} 

public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> { 

    public void reduce(Text key, Iterable<IntWritable> values, Context context) 
     throws IOException, InterruptedException { 
     int sum = 0; 
     for (IntWritable val : values) { 
      sum += val.get(); 
     } 
     context.write(key, new IntWritable(sum)); 
    } 
} 

public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
     conf.set("mapred.job.tracker", "hdfs://localhost:50001"); 
     conf.set("fs.default.name", "hdfs://localhost:50000"); 
     Job job = new Job(conf, "wordcount"); 

    job.setJarByClass(WordCount.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 

    job.setMapperClass(Map.class); 
    job.setReducerClass(Reduce.class); 

    job.setInputFormatClass(TextInputFormat.class); 
    job.setOutputFormatClass(TextOutputFormat.class); 

    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 

    job.waitForCompletion(true); 
} 

} 

Или Если вы хотите использовать заранее использовать версию этого кода с тремя аргументами, здесь третий один файл, который вы не хотите рассчитывать пример ,

package org.samples.mapreduce.training; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.net.URI; 
import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 
import java.util.StringTokenizer; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
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.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.mapreduce.Counter; 
import org.apache.hadoop.util.GenericOptionsParser; 
import org.apache.hadoop.util.StringUtils; 

public class WordCountV2 { 

    public static class TokenizerMapper 
     extends Mapper<Object, Text, Text, IntWritable>{ 

    static enum CountersEnum { INPUT_WORDS } 

    private final static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 

    private boolean caseSensitive; 
    private Set<String> patternsToSkip = new HashSet<String>(); 

    private Configuration conf; 
    private BufferedReader fis; 

    @Override 
    public void setup(Context context) throws IOException, 
     InterruptedException { 
     conf = context.getConfiguration(); 
     caseSensitive = conf.getBoolean("wordcount.case.sensitive", true); 
     if (conf.getBoolean("wordcount.skip.patterns", true)) { 
     URI[] patternsURIs = Job.getInstance(conf).getCacheFiles(); 
     for (URI patternsURI : patternsURIs) { 
      Path patternsPath = new Path(patternsURI.getPath()); 
      String patternsFileName = patternsPath.getName().toString(); 
      parseSkipFile(patternsFileName); 
     } 
     } 
    } 

    private void parseSkipFile(String fileName) { 
     try { 
     fis = new BufferedReader(new FileReader(fileName)); 
     String pattern = null; 
     while ((pattern = fis.readLine()) != null) { 
      patternsToSkip.add(pattern); 
     } 
     } catch (IOException ioe) { 
     System.err.println("Caught exception while parsing the cached file '" 
      + StringUtils.stringifyException(ioe)); 
     } 
    } 

    @Override 
    public void map(Object key, Text value, Context context 
        ) throws IOException, InterruptedException { 
     String line = (caseSensitive) ? 
      value.toString() : value.toString().toLowerCase(); 
     for (String pattern : patternsToSkip) { 
     line = line.replaceAll(pattern, ""); 
     } 
     StringTokenizer itr = new StringTokenizer(line); 
     while (itr.hasMoreTokens()) { 
     word.set(itr.nextToken()); 
     context.write(word, one); 
     Counter counter = context.getCounter(CountersEnum.class.getName(), 
      CountersEnum.INPUT_WORDS.toString()); 
     counter.increment(1); 
     } 
    } 
    } 

    public static class IntSumReducer 
     extends Reducer<Text,IntWritable,Text,IntWritable> { 
    private IntWritable result = new IntWritable(); 

    public void reduce(Text key, Iterable<IntWritable> values, 
         Context context 
         ) throws IOException, InterruptedException { 
     int sum = 0; 
     for (IntWritable val : values) { 
     sum += val.get(); 
     } 
     result.set(sum); 
     context.write(key, result); 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    GenericOptionsParser optionParser = new GenericOptionsParser(conf, args); 
    String[] remainingArgs = optionParser.getRemainingArgs(); 
    if (!(remainingArgs.length != 2 || remainingArgs.length != 4)) { 
     System.err.println("Usage: wordcount <in> <out> [-skip skipPatternFile]"); 
     System.exit(2); 
    } 
    Job job = Job.getInstance(conf, "word count"); 
    job.setJarByClass(WordCountV2.class); 
    job.setMapperClass(TokenizerMapper.class); 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 

    List<String> otherArgs = new ArrayList<String>(); 
    for (int i=0; i < remainingArgs.length; ++i) { 
     if ("-skip".equals(remainingArgs[i])) { 
     job.addCacheFile(new Path(remainingArgs[++i]).toUri()); 
     job.getConfiguration().setBoolean("wordcount.skip.patterns", true); 
     } else { 
     otherArgs.add(remainingArgs[i]); 
     } 
    } 
    FileInputFormat.addInputPath(job, new Path(otherArgs.get(0))); 
    FileOutputFormat.setOutputPath(job, new Path(otherArgs.get(1))); 

    System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } 
} 
+0

Добавил все банки в Commons и mapreduce directory, у версии 1 все еще есть этот раздражающий предупреждающий msg, он может завершиться в пределах eclipse, но он завершится с «ClassNotFoundException» при экспорте в качестве исполняемого банку. версия-2 получила исключение NullPointException в строке 49. –

+0

Я думаю, вы не установили ** job.setJarByClass (WordCount.class); ** и убедитесь, что вместо имени вашего класса должно быть ** WordCount.class ** ... и я запускаю jar-файл, который отлично работает, редактирует соответствующие параметры и значения. Пример: ** conf.set ("mapred.job.tracker", "hdfs: // localhost: 50001"); ** здесь у вас есть установите другой номер порта, просто проверьте эти значения и параметры. –

Смежные вопросы