2011-04-27 80 views
2

我有一个我自己创建的jar文件“Tsp.jar”。这个相同的jar文件在hadoop的单节点集群设置中执行得很好。但是,当我在包含2台机器,笔记本电脑和台式机的集群上运行它时,它会在地图功能达到50%时给我一个例外。这里是输出hadoop没有在多节点集群中运行

`[email protected]:/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 

[email protected]:~$ jps 
4937 Jps 
3976 RunJar 

` ALSE群集工作得很好执行单词计数的例子。所以我猜测它与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)); 
    } 
    } 
} 
+0

您是否定义过减少静态类? – khmarbaise 2011-04-27 12:06:27

+0

您可以发布简化的代码吗?我们可能需要查看映射器和缩减器的扩展方式以及覆盖的定义。以及您的作业设置代码。 – Nija 2011-04-27 13:59:01

+0

@khmarbaise:是的,我做到了。 – emiljho 2011-04-28 17:00:07

回答

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). 

他们说的去做,如何设置作业时,设置好类包含的罐子。 Hadoop将该jar复制到DistributedCache(每个节点上的一个文件系统)并使用这些类。

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 set你不设置一个罐子。

您将需要类似的东西

conf.setJarByClass(Tsp.class); 

从我所看到的,应该可以解决这里看到的错误。

2

我有完全相同的问题。下面是我解决问题的方式(想象你的地图缩小班称为A)。创建职位电话后:
job.setJarByClass(A.class);