2011-01-13 16 views
5

Sto modificando una mappa hasdoop - riduci il lavoro che attualmente compila e gira bene senza le mie modifiche.Hadoop lanciando java.lang.VerifyError dopo aver esportato il file jar

Come parte del lavoro, mi collegherò a S3 per consegnare un file.

Ho sviluppato una (molto semplice) classe s3Connector, l'ho testata e l'ho eseguita in eclissi, quindi sono andata a collegarla al mio lavoro di riduzione. Per eseguire il lavoro in hadoop, devo esportare il progetto come file jar, quindi richiamarlo da hadoop. Il file jar sembra compilare ed esportare senza problemi da Eclipse, ma quando lo eseguo in hadoop, ottengo un'eccezione java.lang.VerifyError.

java.lang.VerifyError: (class: com/extrabux/services/S3Connector, method: 
connectToS3 signature:()V) Incompatible argument to function 

Diversi altri messaggi menzionare che ci possa essere la versione jar dipendenze che sono contrastanti, ma nella mia eclissi percorso di generazione, ho aggiunto tutti i file jar più recenti per le librerie specificate, e li spinsero verso l'alto del costruire ordine del percorso.

Questo è quanto di semplice come posso isolarlo verso il basso per:

import org.jets3t.service.impl.rest.httpclient.RestS3Service; 
import org.jets3t.service.security.AWSCredentials; 

public class S3Connector { 

protected RestS3Service s3Service; 
protected AWSCredentials awsCredentials; 


public S3Connector() 
{ 
    this.awsCredentials= new AWSCredentials("my secret 1", "my secret 2"); 
} 


public void connectToS3() throws Exception 
{ 
    this.s3Service = new RestS3Service(this.awsCredentials); 
} 

} 

Anche questo semplice classe morirà .. Same messaggio. Non appena annoto le credenziali AWS nel costruttore e nel RestS3Service, il problema scompare. Fondamentalmente, penso che sia un qualche tipo di problema di esportazione di librerie da Eclipse, ma non sono sicuro di come trovarlo.

risposta

4

Capito. C'era una vecchia versione del jar jets3t che era nella dir hadoop lib

lo script da riga di comando hadoop scorre su tutti i jar nella directory lib e li aggiunge fisicamente al classpath sul comando di riga di comando exec eseguito costruisce. Questo classpath della riga di comando del jar 0.6.0 stava sovrascrivendo il buon jar 0.8.0 che stavo esportando nel mio file jar. Poiché la versione 0.6.0 non aveva il costruttore specificato per RestS3Service, veniva lanciato java.lang.VerifyError. Rimuovendo la lib 0.6.0 da hadoop, tutto andava bene.

+0

grazie per aver postato la risposta! salvato la mia giornata :) – vkris

+1

Un passo avanti quando ho distribuito ad AWS, ho scoperto che Amazon hadoop utilizza la libreria 0.7.x. Speriamo che questo aiuti anche se stai usando il hadoop di Amazon. – Zak

+0

Sto usando il servizio Amazon hadoop. Ho lo stesso problema, ma anche se ho rimosso il jets3t-0.6.0.jar in lib /, non funziona ancora. Ho visto i tuoi commenti Vuoi dire che dovremmo usare la versione 0.7.0 anziché 0.8.0? – user571470

Problemi correlati