2011-08-22 29 views
7

Tôi đang viết một InputFormat tùy chỉnh cho Hadoop 0.20.2 và đang chạy vào một NoSuchMethodException tôi không thể thoát khỏi. Tôi bắt đầu với:Tùy chỉnh MapReduce định dạng đầu vào - không thể tìm thấy constructor

public class ConnectionInputFormat extends FileInputFormat<Text, Connection> { 

    @Override 
    public RecordReader<Text, Connection> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException { 
     return new ConnectionRecordReader(); 
    } 
} 

Tôi đã nhận lỗi này khi chạy:

Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodException: testingground.TestInputJob$ConnectionInputFormat.<init>() 
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115) 
at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:882) 
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:779) 
at org.apache.hadoop.mapreduce.Job.submit(Job.java:432) 
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447) 
at testingground.TestInputJob.run(TestInputJob.java:141) 
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 
at testingground.TestInputJob.main(TestInputJob.java:156) 
Caused by: java.lang.NoSuchMethodException: testingground.TestInputJob$ConnectionInputFormat.<init>() 
at java.lang.Class.getConstructor0(Class.java:2706) 
at java.lang.Class.getDeclaredConstructor(Class.java:1985) 
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:109) 
... 8 more 
Java Result: 1 

Sau khi nhận được báo lỗi inititially và nghiên cứu trực tuyến, tôi nghĩ rằng nó có thể là tôi không có một constructor không có đối số , vì vậy tôi đã thêm một:

public class ConnectionInputFormat extends FileInputFormat<Text, Connection> { 

    public ConnectionInputFormat() { 
     System.out.println("NetflowInputFormat Constructor"); 
    } 

    @Override 
    public RecordReader<Text, Connection> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException { 
     return new ConnectionRecordReader(); 
    } 
} 

đó không làm việc, hoặc, vì vậy tôi đã thêm một constructor thứ hai mà mất trong bất kỳ số lượng các đối tượng:

public class ConnectionInputFormat extends FileInputFormat<Text, Connection> { 

    public ConnectionInputFormat() { 
     System.out.println("NetflowInputFormat Constructor"); 
    } 

    public ConnectionInputFormat(Object... o) { 
     System.out.println("NetflowInputFormat Constructor"); 
    } 

    @Override 
    public RecordReader<Text, Connection> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException { 
     return new ConnectionRecordReader(); 
    } 
} 

Vẫn gặp lỗi tương tự và đến nay vẫn chưa thành công trong việc tìm kiếm giải pháp.

Full nguồn hiện tại: http://pastebin.com/2XyW5ZSS

+0

Chỉ cần xóa hàm tạo của bạn, không cần phải có hàm tạo trong định dạng nhập của bạn. –

Trả lời

7

lớp ConnectionInputFormat của bạn nên được tĩnh. Các lớp lồng nhau không tĩnh có ngụ ý 'this' được thêm vào mọi constructor. Do đó, hàm tạo no-arg của bạn thực sự có đối số vô hình trừ khi lớp được khai báo là tĩnh.

+2

Đã đến một kết luận tương tự sau một số lần gỡ lỗi khó khăn tối qua. "Cái này" được gửi tới hàm tạo là lớp cha (TestInputJob). Lớp này sau đó so sánh số tham số trong các hàm tạo của "this" hoặc TestInputJob (không có) cho số tham số trong các hàm tạo trong lớp lồng nhau ConnectionInputFormat. Vì chúng rõ ràng là khác nhau, nó đã thất bại. – BugsPray

+0

@BugsPray: Đó là những gì tôi đang cố gắng nói. Từ ngữ của bạn tốt hơn. –

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