2017-01-16 5 views
3

EMR 마스터 노드에서 내 응용 프로그램을 실행하는 데 문제가 있습니다. 버전 1.11에 추가 된 일부 AWS SDK 메소드에 액세스해야합니다. 필요한 모든 의존성은 뚱뚱한 항아리에 번들로 묶여 응용 프로그램은 내 devbox에서 예상대로 작동합니다.AWS EMR 마스터 노드의 기본 aws-sdk jar 무시

그러나 앱이 EMR 마스터 노드에서 실행되면 메서드를 호출 할 때 NoSuchMethodError 예외로 실패하고 AWS SDK 버전 1.11 이상에 추가됩니다 (예 :

java.lang.NoSuchMethodError: 
com.amazonaws.services.sqs.model.SendMessageRequest.withMessageDeduplicationId(Ljava/lang/String;)Lcom/amazonaws/services/sqs/model/SendMessageRequest; 

내가 시작 JVM 인스턴스에 전달 된 클래스 경로 매개 변수에 아래로 추적 스파크 제출 특히

-cp /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf/:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/lib/spark/conf/:/usr/lib/spark/jars/*:/etc/hadoop/conf/ 

를, 그것은는/usr/share/AWS/AWS-자바 SDK를로드 /aws-java-sdk-sqs-1.10.75.1.jar 내 뚱뚱보 병에서 ver 1.11.77을 사용하는 대신.

Spark에서 내가 필요로하는 AWS SDK 버전을 강제로 사용할 수있는 방법이 있습니까?

+0

그것은'당신의 제공 항아리가 클래스 경로 PARAMS를 오버라이드 (override) 할 수 있도록해야한다 true로 설정 spark.executor.userClassPathFirst' 것 같습니다. html –

+0

@DaveMaple : spark-submit 명령 줄에 --conf spark.driver.userClassPathFirst = true를 추가하려고했습니다. 내 응용 프로그램은 스레드 "main"에 예외가 거의 즉시 존재합니다. java.lang.RuntimeException : java.lang.RuntimeException : class org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback이 아닌 org.apache.hadoop.security.GroupMappingServiceProvider. 나에게 버전 충돌이있는 것 같습니다. –

+0

. 네. 나는 우리가 단지 aws sdk에 대해서만 선택적이어야한다고 생각한다. 이것을 생각할 것이다. –

답변

2

다음은이 문제를 해결하는 방법을 배웠습니다.

기본 클래스 경로 매개 변수는 /etc/spark/conf/spark-defaults.conf의 spark.driver.extraClassPath 설정을 사용하여 구성됩니다. spark.driver.extraClassPath에는 이전 버전 인 AWS SDK에 대한 참조가 포함되어 있습니다.이 파일은 /usr/share/aws/aws-java-sdk/*

AWS API의 최신 버전을 사용하기 위해 홈 디렉토리에서 만든 디렉토리에 jar 파일을 업로드하고 --driver-class-pathspark-submit 매개 변수 : http://spark.apache.org/docs/latest/configuration를 :

--driver-class-path '/home/hadoop/aws/*'