2

自分で作ったjarファイル「Tsp.jar」があります。この同じ jar ファイルは、Hadoop の単一ノード クラスタ セットアップで適切に実行されます。ただし、ラップトップとデスクトップの 2 台のマシンで構成されるクラスターで実行すると、マップ機能が 50% に達すると例外が発生します。ここに出力があります

`hadoop@psycho-O:/usr/local/hadoop$ bin/hadoop jar Tsp.jar clust-Tsp_ip1 clust_Tsp_op4
11/04/27 16:13:06 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
11/04/27 16:13:06 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
11/04/27 16:13:06 INFO mapred.FileInputFormat: Total input paths to process : 1
11/04/27 16:13:06 INFO mapred.JobClient: Running job: job_201104271608_0001
11/04/27 16:13:07 INFO mapred.JobClient:  map 0% reduce 0%
11/04/27 16:13:17 INFO mapred.JobClient:  map 50% reduce 0%
11/04/27 16:13:20 INFO mapred.JobClient: Task Id : attempt_201104271608_0001_m_000001_0, Status : FAILED
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Tsp$TspReducer
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:841)
    at org.apache.hadoop.mapred.JobConf.getCombinerClass(JobConf.java:853)
    at org.apache.hadoop.mapred.Task$CombinerRunner.create(Task.java:1100)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:812)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:350)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
    at org.apache.hadoop.mapred.Child.main(Child.java:170)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Tsp$TspReducer
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:809)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:833)
    ... 6 more
Caused by: java.lang.ClassNotFoundException: Tsp$TspReducer
    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:762)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:807)
    ... 7 more

11/04/27 16:13:20 WARN mapred.JobClient: Error reading task outputemil-desktop
11/04/27 16:13:20 WARN mapred.JobClient: Error reading task outputemil-desktop
^Z
[1]+  Stopped                 bin/hadoop jar Tsp.jar clust-Tsp_ip1 clust_Tsp_op4

hadoop@psycho-O:~$ jps
4937 Jps
3976 RunJar

` また、クラスターは wordcount の例を実行しても問題なく動作しました。したがって、Tsp.jar ファイルに問題があると思います。

1) クラスターで実行するために jar ファイルが必要ですか?

2) ここでは、作成したクラスターで jar ファイルを実行しようとしました。しかし、それでもjarファイルが見つからないという警告が表示されます。何故ですか?

3) jar ファイルを実行する際に気をつけなければならないことは何ですか? 私が書いたプログラム以外に何が含まれていなければならないのですか?私のjarファイルには、Tsp.class、Tsp$TspReducer.class、およびTsp$TspMapper.classが含まれています。端末は、Tsp$TspReducer が既に jar ファイルにある場合、見つからないと言います。

ありがとうございました

編集

public class Tsp {
    public static void main(String[] args) throws IOException {
    JobConf conf = new JobConf(Tsp.class);
    conf.setJobName("Tsp");
    conf.setOutputKeyClass(Text.class);
    conf.setOutputValueClass(Text.class);
    conf.setMapperClass(TspMapper.class);
    conf.setCombinerClass(TspReducer.class);
    conf.setReducerClass(TspReducer.class); 
    FileInputFormat.addInputPath(conf,new Path(args[0]));
    FileOutputFormat.setOutputPath(conf,new Path(args[1]));
    JobClient.runJob(conf);
    }
    public static class TspMapper extends MapReduceBase
    implements Mapper<LongWritable, Text, Text, Text> {
    function findCost() {
    }
    public void map(LongWritable key,Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
        find adjacency matrix from the input;
        for(int i = 0; ...) {
        .....
        output.collect(new Text(string1), new Text(string2));
        }
    }
    }    
    public static class TspReducer extends MapReduceBase implements Reducer<Text, Text, Text, Text> { 
    Text t1 = new Text();
    public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
        String a;
            a = values.next().toString();
            output.collect(key,new Text(a));
    }
    }
}
4

3 に答える 3

7

現在持っている

conf.setJobName("Tsp");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(Text.class);
conf.setMapperClass(TspMapper.class);
conf.setCombinerClass(TspReducer.class);
conf.setReducerClass(TspReducer.class); 

エラーがNo job jar file setjarを設定していないことを示しているためです。

次のようなものが必要になります

conf.setJarByClass(Tsp.class);

私が見ていることから、それはここに見られるエラーを解決するはずです。

于 2011-04-28T17:54:53.977 に答える
2
11/04/27 16:13:06 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).

彼らが言うことをしてください、あなたの仕事を設定するとき、クラスが含まれているjarを設定してください。Hadoop は jar を DistributedCache (すべてのノードのファイル システム) にコピーし、そこからクラスを使用します。

于 2011-04-27T17:09:02.547 に答える
2

まったく同じ問題がありました。これが私が問題を解決した方法です(マップ削減クラスがAと呼ばれていると想像してください)。ジョブ呼び出しを作成した後:
job.setJarByClass(A.class);

于 2011-06-23T19:11:13.010 に答える