2013-01-15 24 views
6

Tôi thấy nhiều câu hỏi liên quan đến ClassNotFoundExceptions, "Không có tập tin jar công việc nào" và Hadoop. Hầu hết trong số họ đều hướng đến việc thiếu phương pháp setJarByClass (hoặc sử dụng JobConf hoặc Job) trong cấu hình. Tôi hơi bối rối với ngoại lệ mà tôi đánh bởi vì tôi có bộ đó. Dưới đây là tất cả những gì mà tôi nghĩ rằng có liên quan (xin vui lòng cho tôi biết bất cứ điều gì nếu tôi đã bỏ qua):Hadoop ClassNotFoundException liên quan đến MapClass

echo $CLASS_PATH 
/root/javajars/mysql-connector-java-5.1.22/mysql-connector-java-5.1.22-bin.jar:/usr/lib/hadoop-0.20/hadoop-core-0.20.2-cdh3u5.jar:. 

Mã (chủ yếu là bỏ qua)

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.TextInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.util.ToolRunner; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.GenericOptionsParser; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.io.IntWritable; 

import java.io.IOException; 
import java.util.Iterator; 
import java.lang.System; 
import java.net.URL; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.sql.ResultSet; 

public class QueryTable extends Configured implements Tool { 

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

    public void map(Object key, Text value, Context context) 
      throws IOException, InterruptedException { 
      ... 
     } 
    } 

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

     public void reduce (Text key, Iterable<IntWritable> values, 
          Context context) throws IOException, InterruptedException { 
      ... 
     } 
    } 

    public int run(String[] args) throws Exception { 
     //Configuration conf = getConf();                                                          
     Configuration conf = new Configuration(); 

     Job job = new Job(conf, "QueryTable"); 
     job.setJarByClass(QueryTable.class); 

     Path in = new Path(args[0]); 
     Path out = new Path(args[1]); 
     FileInputFormat.setInputPaths(job, in); 
     //FileInputFormat.addInputPath(job, in);                                                         
     FileOutputFormat.setOutputPath(job, out); 

     job.setMapperClass(MapClass.class); 
     job.setCombinerClass(Reduce.class); // new                                                        
     job.setReducerClass(Reduce.class); 

     job.setInputFormatClass(TextInputFormat.class); 
     job.setOutputFormatClass(TextOutputFormat.class); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(Text.class); 

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

    public static void main(String[] args) throws Exception { 
     int res = ToolRunner.run(new Configuration(), new QueryTable(), args); 
     System.exit(res); 
    } 
} 

sau đó tôi biên dịch, tạo ra các lọ, và chạy:

javac QueryTable.java -d QueryTable 
jar -cvf QueryTable.jar -C QueryTable/ . 
hadoop jar QueryTable.jar QueryTable input output 

đây là ngoại lệ:

13/01/14 17:09:30 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 
**13/01/14 17:09:30 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).** 
13/01/14 17:09:30 INFO input.FileInputFormat: Total input paths to process : 1 
13/01/14 17:09:30 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
13/01/14 17:09:30 WARN snappy.LoadSnappy: Snappy native library not loaded 
13/01/14 17:09:31 INFO mapred.JobClient: Running job: job_201301081120_0045 
13/01/14 17:09:33 INFO mapred.JobClient: map 0% reduce 0% 
    13/01/14 17:09:39 INFO mapred.JobClient: Task Id : attempt_201301081120_0045_m_000000_0, Status : FAILED 
java.lang.RuntimeException: java.lang.ClassNotFoundException: QueryTable$MapClass 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1004) 
    at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:217) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:602) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:266) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1278) 
    at org.apache.hadoop.mapred.Child.main(Child.java:260) 
Caused by: java.lang.ClassNotFoundException: QueryTable$MapClass 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadCl 

Xin lỗi vì bức tường văn bản khổng lồ đó. Tôi không hiểu tại sao tôi nhận được cảnh báo về việc không có tập tin jar công việc nào được đặt. Tôi đặt nó trong phương pháp chạy của tôi. Ngoài ra, cảnh báo được phát hành bởi JobClient, và trong mã của tôi, tôi đang sử dụng Job chứ không phải JobClient. Nếu bạn có bất kỳ ý tưởng hoặc phản hồi nào tôi rất quan tâm. Cảm ơn vì đã dành thời gian cho tôi!

EDIT

Nội dung jar:

jar -tvf QueryTable.jar 
    0 Tue Jan 15 14:40:46 EST 2013 META-INF/ 
    68 Tue Jan 15 14:40:46 EST 2013 META-INF/MANIFEST.MF 
3091 Tue Jan 15 14:40:10 EST 2013 QueryTable.class 
3173 Tue Jan 15 14:40:10 EST 2013 QueryTable$MapClass.class 
1699 Tue Jan 15 14:40:10 EST 2013 QueryTable$Reduce.class 
+0

bạn có thể làm jar -tvf trên bình để hiển thị nội dung của nó (và dán lại câu hỏi của bạn chứ không phải là nhận xét) –

Trả lời

3

tôi đã có thể khắc phục vấn đề bằng cách tuyên bố một gói ở đầu nguồn của tôi.

package com.foo.hadoop; 

Sau đó tôi đã biên dịch, tạo bình và gọi Hadoop một cách rõ ràng với gói được thêm vào tên lớp.

hadoop jar QueryTable.jar com.foo.hadoop.QueryTable input output 

Tôi hiểu đây là những gì hầu hết mọi người đã có thể làm để bắt đầu với, mặc dù tôi nghĩ rằng nó sẽ vẫn làm việc mà không chỉ định một gói. Nó chắc chắn là thực hành tốt hơn mặc dù và nó đã cho phép tôi tiến hành.

+0

Tôi gặp vấn đề tương tự khi biên dịch jar dưới dạng tệp Jn Runnable. Tôi đã thay đổi nó thành bình thường JAR và với cách tiếp cận của bạn cho các đường dẫn đầy đủ bao gồm cả gói nó làm việc tốt .. – himanshu

+0

Không làm việc cho tôi, vẫn có 'ClassNotFoundException: com.foo.hadoop.SomeClass' – CDT

+0

jar của bạn tạo ra cái nhìn lệnh như? Còn về việc chạy "jar -tvf your_jar" thì sao? – cbrown

Các vấn đề liên quan