Java VerifyError

Résolu
Harru -  
 Harru -
Bonjour,


Je développe actuellement une application se basant sur Hadoop avec un bon nombre de jar différent importés et j'obtiens l'erreur suivante :


Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
org/apache/hadoop/mapred/JobTrackerInstrumentation.create(Lorg/apache/hadoop/mapred/JobTracker;Lorg/apache/hadoop/mapred/JobConf;)Lorg/apache/hadoop/mapred/JobTrackerInstrumentation; @5: invokestatic
Reason:
Type 'org/apache/hadoop/metrics2/lib/DefaultMetricsSystem' (current frame, stack[2]) is not assignable to 'org/apache/hadoop/metrics2/MetricsSystem'
Current Frame:
bci: @5
flags: { }
locals: { 'org/apache/hadoop/mapred/JobTracker', 'org/apache/hadoop/mapred/JobConf' }
stack: { 'org/apache/hadoop/mapred/JobTracker', 'org/apache/hadoop/mapred/JobConf', 'org/apache/hadoop/metrics2/lib/DefaultMetricsSystem' }
Bytecode:
0000000: 2a2b b200 03b8 0004 b0

at org.apache.hadoop.mapred.LocalJobRunner.<init>(LocalJobRunner.java:573)
at org.apache.hadoop.mapred.JobClient.init(JobClient.java:494)
at org.apache.hadoop.mapred.JobClient.<init>(JobClient.java:479)
at org.apache.hadoop.mapreduce.Job$1.run(Job.java:563)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
at org.apache.hadoop.mapreduce.Job.connect(Job.java:561)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:549)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
at fr.silpc.hadoop.GetStats.main(GetStats.java:82)


Jusque la toute les erreurs que j'ai rencontré était dut à une classe manquante ou une incompatibilité de version qui se réglait en ajoutant ou modifiant la version d'un jar. Mais avec cette erreur je ne vois pas quoi faire.


Auriez-vous quelques idées ?
A voir également:

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

C'est pour moi toujours un problème de version :
Type 'org/apache/hadoop/metrics2/lib/DefaultMetricsSystem' (current frame, stack[2]) is not assignable to 'org/apache/hadoop/metrics2/MetricsSystem'

Il doit y avoir confusion entre l'interface MetricsSystem dont hérite l'enum DefaultMetricsSystem (version r1.2.1 par exemple) et l'ancienne public abstract class MetricsSystem (version r0.23.11 par exemple) que ne peux pas étendre DefaultMetricsSystem puisque c'est un enum...

Du coup l'assignation
MetricsSystem metrics = DefaultMetricsSystem.INSTANCE
est invalide à l'exécution.

Il faudrait identifier quel jar possède l'ancienne dépendance de MetricsSystem et le mettre plus bas dans le classpath, derrière le jar qui possède la bonne dépendance MetricsSystem (qui possède probablement aussi DefaultMetricsSystem). Comme ça, le deuxième chargement sera ignoré et c'est la bonne version de MetricsSystem qui sera utilisée.

Remarque : pour gérer tes dépendances sans (trop) se casser la tête, tu devrais regarder du côté de Maven. (Débuter avec Maven)
0
Harru
 
Merci de ta réponse, j'ai résolu mon problème.

Les anciennes versions des jar n'était plus dans le classpath mais était toujours présent dans un dossier du projet. En les supprimant de ce dossier ça marche.
0