2015-07-28 12 views
6

Dostaję ten wyjątek podczas pisania obiektu do HDFS:NoSuchMethodError pisanie Avro obiekt do HDFS użyciu 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) 

Linia jest odniesienie w wygenerowanego kodu jest taka:

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

a rozmowa w moim kodu jest taka:

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

wywołanie newBuilder() w kodzie testowym nie powoduje problemy w ogóle.

Słoik jest uruchamiany w węźle HDFS przy użyciu polecenia hadoop jar.

Jakieś pomysły, co może być nie tak?

Odpowiedz

4

org.apache.avroSchema.Parser.parse(String s, String... more) został wprowadzony dopiero w wersji Avro 1.7.5. Zwróć uwagę na jego nieobecność w 1.7.4 Schema.Parser documentation. Albo zaktualizować węzeł HDFS użyć nowszą wersję Avro, lub przyłączyć się jak struny jak current 1.7 version of Schema robi i zastosować metodę, która przyjmuje jeden ciąg znaków zamiast:

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

EDIT: nigdy nie próbowałem uaktualnienie Avro na instalacji Hadoop, ale przypuszczam, że prawdopodobnie mógłbyś znaleźć słoiki i zastąpić je ręcznie, jeśli jest to niewielkie uaktualnienie wersji.

~/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 

Spróbuj pobrać Avro 1.7.7 i zastępując te wszystkie znalezione słoiki z pobranymi jeden. Zrobiłbym kopię zapasową instalacji Hadoop, gdyby wszystko poszło nie tak.

+0

Ok to może być to. Mój węzeł HDFS używa Avro 1.7.4 podczas uruchamiania słoika. Czy istnieje prosty sposób na aktualizację wspólnych słoików w węzłach HDFS? Czy jest to nowa instalacja Hadoop? –

+0

@jimmy_terra Edytowałem swój post z sugerowanym sposobem aktualizacji Avro. Nie możemy jednak zagwarantować, że będzie działać na Twojej aplikacji. – heenenee

+0

Proponuję obniżenie poziomu kompilacji (Gradle/Maven/cokolwiek), aby dopasować wersję do środowiska, w którym się wykonuje (przynajmniej do momentu uaktualnienia klastra). Prawidłowy sposób aktualizacji klastra zależy od konfiguracji i dostawcy (jeśli dotyczy). – Keegan

Powiązane problemy