2015-07-28 17 views
6

tôi nhận được ngoại lệ này khi viết một đối tượng để HDFS:NoSuchMethodError viết đối tượng Avro để HDFS sử dụng Builder

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.avro.Schema$Parser.parse(Ljava/lang/String;[Ljava/lang/String;)Lorg/apache/avro/Schema; 
     at com.blah.SomeType.<clinit>(SomeType.java:10) 

Dòng nó được tham khảo trong các mã được tạo ra là thế này:

public class SomeType extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord { 
    public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse .......... 

Và cuộc gọi trong mã của tôi là:

val someTypeBuilder = SomeType.newBuilder() 
     .setSomeField("some value") 
     // set a whole load of other fields 

Gọi mã kiểm tra là nguyên nhân không có vấn đề.

Bình đang được chạy trên nút HDFS sử dụng lệnh hadoop jar.

Bất kỳ ý tưởng nào có thể xảy ra ở đây?

Trả lời

4

org.apache.avroSchema.Parser.parse(String s, String... more) không được giới thiệu cho đến khi Avro 1.7.5. Lưu ý sự vắng mặt của nó trong 1.7.4 Schema.Parser documentation. Hoặc cập nhật nút HDFS của bạn để sử dụng một phiên bản mới hơn của Avro, hoặc tham gia vào các Strings mình thích như thế nào current 1.7 version of Schema làm và sử dụng phương pháp mà phải mất một chuỗi duy nhất thay vì:

public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse(String.join("", prevArg1, prevArg2)); 

EDIT: Tôi chưa bao giờ cố gắng nâng cấp Avro trên một cài đặt Hadoop, nhưng tôi đoán bạn có thể chỉ cần tìm các lọ và thay thế chúng theo cách thủ công nếu đó là một phiên bản nâng cấp nhỏ.

~/dev/hadoop/hadoop-2.7.1$ find . -name '*avro*.jar' 
./share/hadoop/tools/lib/avro-1.7.4.jar 
./share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib/avro-1.7.4.jar 
./share/hadoop/common/lib/avro-1.7.4.jar 
./share/hadoop/mapreduce/lib/avro-1.7.4.jar 
./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/avro-1.7.4.jar 

Hãy thử tải xuống Avro 1.7.7 và thay thế tất cả các lọ được tìm thấy bằng hộp đã tải xuống. Tôi cũng sẽ sao lưu cài đặt Hadoop trong trường hợp nó bị hỏng.

+0

Ok điều này có thể xảy ra. Nút HDFS của tôi đang sử dụng Avro 1.7.4 khi chạy bình. Có cách nào dễ dàng để cập nhật các jars được chia sẻ trên các nút HDFS? Hay là một bản cài đặt Hadoop mới? –

+0

@jimmy_terra Tôi đã chỉnh sửa bài đăng của mình bằng cách nâng cấp Avro. Không thể đảm bảo nó sẽ làm việc cho ứng dụng của bạn mặc dù. – heenenee

+0

Tôi khuyên bạn nên hạ cấp bản dựng của bạn (Gradle/Maven/bất kỳ thứ gì) để khớp với phiên bản trong môi trường mà bạn đang thực thi (ít nhất là cho đến khi bạn nâng cấp cụm của mình). Cách chính xác để nâng cấp cụm của bạn phụ thuộc vào thiết lập và nhà cung cấp của bạn (nếu có). – Keegan

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