2011-01-13 2 views
5

hadoop 맵을 변경하려고합니다. 변경 사항없이 현재 컴파일되고 올바르게 실행되는 작업을 줄입니다.jar 파일을 내 보낸 후 Hadoop이 java.lang.VerifyError를 throw합니다.

작업의 일부로, 이제 파일을 전송하기 위해 S3에 연결합니다.

(매우 간단한) s3Connector 클래스를 테스트하고 실행하여 이클립스에서 실행했습니다. 그런 다음 내 축소 작업에 연결했습니다. hadoop에서 작업을 실행하려면 프로젝트를 jar 파일로 내 보낸 다음 hadoop에서 호출해야합니다. jar 파일은 Eclipse에서 문제없이 컴파일하고 내보내는 것처럼 보이지만 hadoop에서 실행할 때 java.lang.VerifyError 예외가 발생합니다.

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

몇 가지 다른 게시물 충돌하는 항아리 버전 종속성이있을 수 있음을 언급,하지만 내 이클립스 빌드 경로에, 나는 지정된 libs와에 대한 모든 최신 jar 파일을 추가하고, 빌드의 상단에 밀어 경로 순서. .. 같은 메시지를 죽을 것이다

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

} 

그것도 간단한 클래스 : 나는 그것을 아래로 분리 할 수 ​​

이 약 간단합니다. 생성자 및 RestS3Service에서 AWS 자격 증명을 주석 처리하면 문제가 사라집니다. 기본적으로, 나는 그것이 일식에서 어떤 종류의 도서관 수출 문제라고 생각하지만 그것을 찾는 방법을 모른다.

답변

4

알아 냈습니다. hadoop lib 디렉토리에 있던 jets3t jar의 이전 버전이있었습니다

hadoop 명령 줄 스크립트는 lib 디렉토리에있는 모든 jar에 대해 루프를 실행하고 최종 exec'ed 명령 줄 명령에서 클래스 경로에 실제로 추가합니다 그것은 구축됩니다. 0.6.0 jar의이 명령 행 클래스 경로는 jar 파일에서 내보내는 0.8.0 jar 파일보다 우선합니다. 0.6.0 버전에는 RestS3Service에 대해 지정된 생성자가 없으므로 java.lang.VerifyError가 발생했습니다. hadoop에서 0.6.0 lib를 제거함으로써 모든 것이 잘되었습니다.

+0

답변을 게시 해 주셔서 감사합니다. 내 하루를 절약했습니다 :) – vkris

+1

AWS에 기증했을 때 한 걸음 더 나아가서 Amazon이 설치 한 hadoop이 0.7.x 라이브러리를 사용한다는 것을 알았습니다. 아마존의 hadoop을 사용하고 있다면 도움이되기를 바랍니다. – Zak

+0

아마존 hadoop 서비스를 사용하고 있습니다. 나는 같은 문제가 있지만 lib /에서 jets3t-0.6.0.jar를 제거하더라도 여전히 작동하지 않습니다. 나는 너의 의견을 보았다. 0.8.0이 아닌 0.7.0 버전을 사용해야한다는 뜻입니까? – user571470

관련 문제