2011-01-13 18 views
5

Zmieniam mapę hadoopów - zmniejsz liczbę zadań, które obecnie kompilują i działają bez moich zmian.Hadoop throwing java.lang.VerifyError po wyeksportowaniu pliku JAR

W ramach pracy będę teraz łączyć się z S3, aby dostarczyć plik.

Opracowałem (bardzo prostą) klasę s3Connector, przetestowałem i uruchomiłem ją w czasie zaćmienia, , a następnie podłączyłem ją do mojej pracy redukującej. Aby uruchomić zadanie w hadoopie, muszę wyeksportować projekt jako plik jar, a następnie wywołać go z hadoop. Plik jar wydaje się kompilować i eksportować bez problemu z zaćmienia, ale gdy uruchomię go w hadoop, otrzymuję wyjątek java.lang.VerifyError.

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

Kilka innych stanowisk wspomnieć, że nie może być w wersji jar zależności, które są sprzeczne, ale w moim Zaćmienie ścieżki budowania, dodałem wszystkie najnowsze pliki jar dla określonych bibliotekami i pchnął je do górnej części kompilacji kolejność ścieżek.

To jest tak proste, jak mogę odizolować go do:

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); 
} 

} 

Nawet takie proste klasy umrze .. sam komunikat. Jak tylko skomentuję dane uwierzytelniające AWS w konstruktorze i RestS3Service, problem zniknie. Zasadniczo, myślę, że to jakiś problem eksportu biblioteki z zaćmienia, ale nie wiem, jak go znaleźć.

Odpowiedz

4

Wyobraziłem to. Była starsza wersja słoika Jets3t, który znajdował się w katalogu hadoop lib dir

pętli skryptu wiersza poleceń nad wszystkimi słoikami w katalogu lib i fizycznie dodaje je do ścieżki klas w komendzie końcowego polecenia exec to buduje. Ścieżka klas wiersza poleceń w wierszu 0.6.0 była nadrzędna dla dobrego słoika 0.8.0, który eksportowałem w pliku JAR. Ponieważ wersja 0.6.0 nie miała określonego konstruktora dla usługi RestS3Service, zgłaszano komunikat java.lang.VerifyError. Po usunięciu biblioteki 0.6.0 z hadoop wszystko było w porządku.

+0

dzięki za ogłoszenie odpowiedzi! uratował mój dzień :) – vkris

+1

Krok dalej, kiedy wprowadziłem do AWS, znalazłem, że Amazon zainstalowany hadoop używa biblioteki 0.7.x .. Mam nadzieję, że to też pomaga, jeśli używasz hadoop firmy Amazon. – Zak

+0

Używam usługi hadoop Amazon. Mam ten sam problem, ale nawet jeśli usunąłem plik jets3t-0.6.0.jar w lib /, to nadal nie działa. Widziałem twoje komentarze. Masz na myśli, że powinniśmy używać wersji 0.7.0 zamiast 0.8.0? – user571470