/ / Hadoop NoSuchMethodError apache.commons.cli - Java, Hadoop, NosuchMethoderror, Apache-Commons-Cli

Hadoop NoSuchMethodError apache.commons.cli - java, hadoop, nosuchmethoderror, apache-commons-cli

Ich benutze hadoop-2.7.2 und ich habe einen MapReduceJob mit IntelliJ gemacht. In meinem Job benutze ich apache.commons.cli-1.3.1 und ich legte die lib in das Glas.

Wenn ich MapReduceJob in meinem Hadoop-Cluster verwende, habe ich einen NoSuchMethodError:

Ausnahme im 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 ist Option und die Klasse Option wird aus dem extrahiert commons-cli.jar zu meinem Bewerbungsglas. Außerdem habe ich dieses Problem bei meinen anderen Bibliotheken nicht.

Vielen Dank für Ihre Zeit.

Antworten:

1 für die Antwort № 1

Das Problem scheint damit zu zusammenhängen, wie die classloader lädt die Klassen. Weil der static Builder class war in common-cli 1.4, während einige der hadoop Abhängigkeiten verweisen immer noch auf ältere Versionen - das Problem ist aufgetreten.

In meinem Fall wurde das Problem durch Ändern derReihenfolge des Hinzufügens der JAR-Datei in den Klassenpfad im Shell-Skript, das für die Einrichtung der Umgebung vor der Programmausführung verantwortlich ist. Früher habe ich das Glas wie in Classpath hinzugefügt

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

wird geändert in

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

und das Problem wurde behoben.


0 für die Antwort № 2

Wir haben dieses Problem mit der nächsten Gradle-Konfiguration behoben:

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

0 für die Antwort № 3

Wir konnten diesen Fehler mit beheben Umzüge der Maven-Klasse. Wenn Sie das Schatten-Plugin verwenden, um Ihr Glas zu erstellen, fügen Sie unter dem entsprechenden Abschnitt Folgendes zu pom.xml hinzu:

<!-- 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 ein expliziter Verweis auf v1.3+ von commons-cli müssen am Anfang des Abschnitts "Abhängigkeiten" hinzugefügt werden, bevor Abhängigkeiten auftreten, die einen transitiven Verweis auf eine ältere Version von commons-cli enthalten.