5

チュートリアルがhttp://java.dzone.com/articles/hadoop-basics-creatingにあるHadoopの基本的なMapReduceプログラムを試しています

クラスの完全なコードは次のとおりです(コードは上記のURLのネットにあります)

import java.io.IOException;
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.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class Dictionary {
public static class WordMapper extends Mapper<Text, Text, Text, Text> {
    private Text word = new Text();

    public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString(), ",");
        while (itr.hasMoreTokens()) {
            word.set(itr.nextToken());
            context.write(key, word);
        }
    }
}

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

    public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        String translations = "";
        for (Text val : values) {
            translations += "|" + val.toString();
        }
        result.set(translations);
        context.write(key, result);
    }
}

public static void main(String[] args) throws Exception {
    System.out.println("welcome to Java 1");
    Configuration conf = new Configuration();
    System.out.println("welcome to Java 2");
    Job job = new Job(conf, "dictionary");
    job.setJarByClass(Dictionary.class);
    job.setMapperClass(WordMapper.class);
    job.setReducerClass(AllTranslationsReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    job.setInputFormatClass(KeyValueTextInputFormat.class);
    FileInputFormat.addInputPath(job, new Path("/tmp/hadoop-cscarioni/dfs/name/file"));
    FileOutputFormat.setOutputPath(job, new Path("output"));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

しかし、日食で実行した後。エラーが発生します。

welcome to Java 1
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.hadoop.conf.Configuration.<clinit>(Configuration.java:73)
at Dictionary.main(Dictionary.java:43)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more
4

5 に答える 5

10

例外はClassNotFoundExceptionではなくNoClassDefFoundErrorであることに注意してください。

:クラスが実行時に表示されていないが、コンパイル時に表示されている場合、NoClassDefFoundErrorがスローされます。これは、必要なクラスファイルがすべて含まれているわけではないJARファイルの配布または作成で発生する可能性があります。

修正するには:ビルド時間と実行時クラスパスの違いを確認してください。

NoClassDefFoundErrorとClassNotFoundExceptionは異なります。1つはエラーで、もう1つは例外です。

NoClassDefFoundError:JVMが検出する予定のクラスの検索に問題があるために発生します。クラスファイルが見つからないため、コンパイル時に動作していたプログラムを実行できません。

ClassNotFoundException:この例外は、クラスがクラスパスで見つからなかったことを示します。つまり、クラス定義を読み込もうとしており、クラスを含むクラス/jarがクラスパスに存在しません。

于 2012-12-08T11:17:41.350 に答える
6

NoClassDefFoundErrorは、クラスが実行時に表示されていないが、コンパイル時に表示されている場合に発生します。必要なすべてのクラスファイルが含まれていなかったため、これはJARファイルに関連している可能性があります。

したがって、 http://commons.apache.org/logging/download_logging.cgiから取得できるクラスパスcommons-logging-1.1.1jarを追加してみてください。

于 2012-12-10T06:26:26.400 に答える
4

NoClassDefFoundError は、指定されたクラスクラスパスに正常に配置されたが、何らかの理由でロードおよび検証できない場合に発生します。ほとんどの場合、問題は、指定されたクラスの検証に必要な別のクラスがないか、バージョンが間違っていることです。

一般的に言えば、このエラーは「クラスパスに (正しいバージョンの) 正しい JAR ファイルがすべて含まれていることを再確認する」ことを意味します。

于 2012-12-08T14:17:05.883 に答える
2

これは、ローカル IDE (Eclipse) で Hadoop Map/Reduce プログラムを実行するときによく発生するエラーです。

ビルド パスに hadoop-core.jar が既に追加されているはずなので、プログラムでコンパイル エラーは検出されません。ただし、hadoop-core は commons-logging.jar (および他のいくつかの jar) に依存しているため、実行するとエラーが発生します。/lib の下にある jar をビルド パスに追加する必要がある場合があります。

依存関係を管理するには、Maven またはその他の依存関係管理ツールを使用することをお勧めします。

于 2012-12-09T14:12:17.010 に答える