2016-07-29 21 views
2

Ich benutze hadoop-2.7.2 und ich habe eine MapReduceJob mit IntelliJ. In meinem Job benutze ich apache.commons.cli-1.3.1 und ich lege die lib in das Glas.Hadoop NoSuchMethodError apache.commons.cli

Als ich die MapReduceJob auf meinem Hadoop-Cluster verwenden Ich habe eine NoSuchMethodError:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.cli.Option.builder(Ljava/lang/String;)Lorg/apache/commons/cli/Option$Builder;

Ich verstehe nicht, weil die Methode in der Klasse vorhanden Option und die Klasse Option vom commons-cli.jar meiner Anwendung extrahiert Krug. Außerdem habe ich dieses Problem nicht mit meinen anderen Bibliotheken.

Vielen Dank für Ihre Zeit.

+0

Ich habe gerade festgestellt, dass hadoop commons-CLi 1.2 verwendet. Ich denke, das ist die Ursache meines Problems, aber ich weiß nicht, wie ich es beheben soll. – Antonin

+0

Sie können versuchen, 'commons-cli-1.2' von der Hadoop-Abhängigkeit in Ihrer' pom.xml' auszuschließen, dann verwendet Hadoop Ihre 'commons-cli-1.3.1'. Wenn es zu Fehlern kommt, sollten Sie besser '1.2' in Ihrem Code verwenden. –

+0

Ich habe so etwas gemacht, aber mein Chef will das nicht, weil es das Problem nicht behebt. Wenn wir das gleiche Problem später mit einer anderen Lib haben, möchte er das Problem nicht noch einmal beheben. Aber danke für Ihren Rat. – Antonin

Antwort

0

Wir lösen dieses Problem mit der nächsten gradle Konfiguration:

compile('org.apache.parquet:parquet-tools:1.9.0'){ 
    exclude module:"commons-cli" 
} 
0

Wir konnten diesen Fehler beheben maven class relocations verwenden. Wenn Sie den Schatten-Plugin verwenden, um Ihr Glas zu bauen, fügen Sie folgenden unter entsprechenden Abschnitt pom.xml:

<!-- necessary to fix NoSuchMethodError: org.apache.commons.cli.Option.builder --> 
          <relocations> 
           <relocation> 
            <pattern>org.apache.commons.cli</pattern> 
            <shadedPattern>org.shaded.commons.cli</shadedPattern> 
           </relocation> 
          </relocations> 

Auch eine explizite Bezugnahme auf v1.3 + of commons-cli muss am oberen Rand des hinzugefügt werden Abhängigkeiten vor jeder Abhängigkeit, die eine transitive Referenz auf eine ältere Version von commons-cli haben kann.

1

Das Problem scheint damit verwandt zu sein, wie die classloader die Klassen lädt. Da die static Builder class in common-cli 1.4 war, während einige der hadoop Abhängigkeiten immer noch auf ältere Version verwiesen - das Problem trat auf.

In meinem Fall, das Problem gelöst durch Ändern der Reihenfolge der JAR-Datei-Zugabe in den Klassenpfad in der Shell-Skript verantwortlich für die Einrichtung der Umgebung vor der Programmausführung. Früher war ich das Hinzufügen des Glases in Classpath wie

CLASSPATH=<Hadoop Jars>:<Common CLI jar>:$CLASSPATH 

auf

geändert
CLASSPATH=<Common CLI jar>:<Hadoop Jars>:$CLASSPATH 

und das Problem behoben.