7
votes

Hadoop Noschmethoderror Apache.commons.cli

J'utilise hadoop-2.7.2 et j'ai fait un Mapreducejob avec Intellij. Dans mon travail, j'utilise apache.cons.cli-1.3.1 et je mets la libère dans le pot.

Quand j'utilise le mapreducejob sur mon cluster Hadoop, j'ai un Noschmethoderror :

exception dans le fil "Main" Java.lang.noschmethoderror: org.apache.commons.cli.option.builder (ljava / lang / string;) LORG / Apache / Commons / CLI / Option $ Builder;

Je ne comprends pas parce que la méthode existe dans la classe Option et la classe (code> est extraite du Commons-cli.jar à mon pot d'application. De plus, je n'ai pas cette question avec mes autres bibliothèques.

Merci pour votre temps.


4 commentaires

Je viens de trouver que Hadoop utilise Commons-CLI 1.2. Je pense que c'est la source de mon problème, mais je ne sais pas comment le réparer.


Vous pouvez essayer d'exclure Commons-cli-1.2 de la dépendance hadoop dans votre pom.xml , puis hadoop utilisera votre Commons-cli-1.3.1 . Si cela provoque des erreurs, vous feriez mieux d'utiliser 1.2 dans votre code.


J'ai fait quelque chose comme ça, mais mon patron ne veut pas de cette façon parce qu'il ne résout pas le problème. Si nous avons le même problème plus tard avec une autre lib, il ne veut plus résoudre le problème. Mais merci de votre conseil.


Je l'ai réparé en modifiant la séquence dans laquelle les pots sont déclarés dans la classe de classe. S'il vous plaît vérifier ma réponse.


3 Réponses :


1
votes

Nous avons résolu ce problème avec la prochaine configuration des grades:

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


0 commentaires

2
votes

Nous avons pu corriger cette erreur en utilisant Maven Relocations de classe . Si vous utilisez le plug-in de l'ombre pour créer votre pot, ajoutez-le après la section POM.XML dans la section appropriée:

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


0 commentaires

3
votes

Le problème semble être lié à la manière dont le chargeur est en train de charger les classes. Étant donné que la classe statique était dans common-cli 1.4 , tandis que certaines des dépendances hadoop se réfèrent toujours à la version plus ancienne - la question s'est produite.

Dans mon cas, la question résolue en modifiant la séquence d'addition de fichier JAR dans la classe de classe dans le script Shell responsable de la configuration de l'environnement avant l'exécution du programme. Plus tôt, j'ajoutais que le pot dans la classe de classe comme xxx

est modifié en xxx

et il a corrigé le problème. < / p>


0 commentaires