2012-07-12 10 views
24

Khi tôi đang chạy tệp .jar của Hadoop từ dấu nhắc lệnh, nó ném một ngoại lệ không có phương thức StockKey như vậy.Không có ngoại lệ cho phương thức như vậy Hadoop <init>

StockKey là lớp tùy chỉnh của tôi được xác định cho loại khóa của riêng tôi.

Đây là ngoại lệ:

12/07/12 00:18:47 INFO mapred.JobClient: Task Id : 
attempt_201207082224_0007_m_000000_1, Status : FAILED 

java.lang.RuntimeException: java.lang.NoSuchMethodException: SecondarySort$StockKey.  
<init>() 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115) 
    at org.apache.hadoop.io.WritableComparator.newKey(WritableComparator.java:109) 
    at org.apache.hadoop.io.WritableComparator.<init>(WritableComparator.java:95) 
    at org.apache.hadoop.io.WritableComparator.get(WritableComparator.java:51) 
    at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:795) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:817) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:383) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:325) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:270) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:396) 
    at  
    org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127) 
    at org.apache.hadoop.mapred.Child.main(Child.java:264) 
+1

Nó ** không ** * không có phương pháp như vậy Phương pháp StockKey "*. Cắt và dán thông báo ngoại lệ ** thực ** và toàn bộ stacktrace vào câu hỏi. –

+0

Đã chỉnh sửa tại đây. Cảm ơn. Bạn có thể nhìn vào nó không? –

+1

Đối với người đọc tương lai như tôi được hướng dẫn ở đây, tôi cũng cảnh báo bạn về việc thực hiện WritableComparable của bạn một lớp bên trong (trong trường hợp của tôi, đó là một lớp bên trong của người lập bản đồ của tôi). Tôi có cùng ngoại lệ như trên.Khi tôi chuyển nó sang một lớp riêng của nó, nó hoạt động tốt –

Trả lời

46

Bạn cần phải cung cấp một constructor mặc định rỗng trong lớp chìa khóa của bạn. Hadoop đang sử dụng sự phản chiếu và nó không thể đoán bất kỳ tham số nào để nạp.

Vì vậy, chỉ cần thêm các nhà xây dựng mặc định:

public StockKey(){} 
+1

Tôi cũng gặp vấn đề này khi thực thi 'Writable' và' WritableComparable' với 'Writable' mặc định - không chỉ bạn phải cung cấp một hàm tạo mặc định, mà constructor mặc định cũng phải khởi tạo bất kỳ biến đối tượng 'Writable' nào khác; nếu không bạn sẽ nhận được một SpillError. – bbengfort

62

Có một điều cần kiểm tra khi nhận được lỗi như thế này cho các lớp học mà là writables, người vẽ bản đồ, gia giảm, vv

Nếu lớp là một bên trong lớp, hãy chắc chắn rằng nó được khai báo static (tức là không cần một thể hiện của lớp kèm theo). Nếu không, Hadoop không thể khởi tạo lớp bên trong của bạn và sẽ đưa ra cùng một lỗi này - đó là một hàm tạo zero-arg là cần thiết.

+3

Bạn chỉ cần có mông của tôi ra khỏi một sling, quá. Cảm ơn bạn đã giải thích về các lớp bên trong tĩnh! –

+1

Tôi không biết lớp bên trong phải tĩnh để khởi tạo bên ngoài lớp học bao quanh, điều này đã giúp tôi tiết kiệm rất nhiều thời gian và thất vọng. – DragonDTG

1

For scala too, tôi cố định vấn đề thêm constructor mặc định như dưới đây,

class IntPair (first : IntWritable, second : IntWritable) extends WritableComparable[IntPair] { 

    def this() = this(first = new IntWritable(), second = new IntWritable()) 

    def getFirst() : IntWritable = { 
     first 
    } 

    def getSecond() : IntWritable = { 
     second 
    } 

} 
0

Không bất kỳ câu trả lời giúp tôi.

Trong trường hợp của tôi, điều đó xảy ra khi tôi giảm khả năng hiển thị của nhà xây dựng do nhầm lẫn hoặc vội vàng.

Ví dụ: constructor cha là công khai và lớp thừa kế là mặc định hoặc được bảo vệ!

0

Đang đối mặt với vấn đề tương tự này. Cố định bằng cách làm theo con trỏ từ @Thomas và @Chris.

Hình như cả các giải pháp này là cần thiết để giải quyết vấn đề:

  • trả lời từ @Thomas được yêu cầu như Hadoop đang sử dụng phản xạ và khi xây dựng các dự án lớn.

  • Trả lời từ @Chris là bắt buộc khi sử dụng lớp bên trong và gọi Trình lập bản đồ/Hộp số từ chính().

0

Đảm bảo bạn có hàm tạo mặc định nhưng tôi cũng phải thêm từ khóa static vào khai báo lớp học của mình. Tức là,

public class SecondarySort { 
    public static void main(String[] args) {...} 

    public static class StockKey extends ... {} 
}