2011-09-10 37 views
0

我應該改變,以解決以下錯誤:了java.lang.RuntimeException:拋出java.lang.ClassNotFoundException試圖在彈性MapReduce運行罐作業時

我想開始彈性MapReduce工作,並崩潰與消息,每次:

java.lang.RuntimeException: java.lang.ClassNotFoundException: iataho.mapreduce.NewMaxTemperatureMapper 
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:831) 
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:157) 
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:577) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:310) 
at org.apache.hadoop.mapred.Child.main(Child.java:170) 
Caused by: java.lang.ClassNotFoundException: iataho.mapreduce.NewMaxTemperatureMapper 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:247) 
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:778) 
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:829) 
... 4 more 

NewMaxTemperatureMapper聲明,我已經檢查,它被包含在罐子裏,這比位於S3。 下面是所有應用類的代碼:

NewMaxTemperature.java:

package iataho.mapreduce; 

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.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 

public class NewMaxTemperature { 
/** 
* @param args 
*/ 
public static void main(String[] args) { 

    try { 
     if (args.length != 2) { 
      System.err.println("Usage: NewMaxTemperature <input path> <output path>"); 
      System.exit(123); 
     } 
     Job job = new Job(); 
     job.setJarByClass(NewMaxTemperature.class); 
     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 

     job.setMapperClass(NewMaxTemperatureMapper.class); 
     job.setCombinerClass(NewMaxTemperatureReducer.class); 
     job.setReducerClass(NewMaxTemperatureReducer.class); 

     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(IntWritable.class); 
     System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

} 

NewMaxTemperatureReducer.java:

package iataho.mapreduce; 

import java.io.IOException; 

import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Reducer; 

public class NewMaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> { 
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
    int maxValue = Integer.MIN_VALUE; 
    for (IntWritable value : values) { 
     maxValue = Math.max(maxValue, value.get()); 
    } 
    context.write(key, new IntWritable(maxValue)); 
} 
} 

NewMaxTemperatureMapper.java:

package iataho.mapreduce; 

import java.io.IOException; 

import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 

public class NewMaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> { 
private static final int MISSING = 9999; 

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
    String line = value.toString(); 
    String year = line.substring(15, 19); 
    int airTemperature; 
    if (line.charAt(87) == '+') { // parseInt doesn't like leading plus 
            // signs 
     airTemperature = Integer.parseInt(line.substring(88, 92)); 
    } else { 
     airTemperature = Integer.parseInt(line.substring(87, 92)); 
    } 
    String quality = line.substring(92, 93); 
    if (airTemperature != MISSING && quality.matches("[01459]")) { 
     context.write(new Text(year), new IntWritable(airTemperature)); 
    } 
} 
} 

我所做的jar文件與我在這裏得到這個崩潰可供選擇:download jar

回答

3

檢查執行應用程序時要包括的罐子。請添加更多關於此問題的信息。

===

好的。問題在於我已經使用了eclipse選項「將庫包裝到生成的JAR中」。我將它改爲「將生成的庫提取到生成的JAR中」,現在它工作正常

+0

所有jar已經被編譯成一個帶有eclipse的單個執行jar;無論如何,它找不到我的課程之一,這是公開的,並在主類相同的包 –

+0

我已經把罐子上線的情況下,任何人想看看它 –

+0

鏈接下載測試。用幾個罐子和你的課程拉鍊,而不是你建立的罐子。如果缺少任何類,請檢查構建jar配置,因爲有些類可能不會意外包含在jar中。 –

相關問題