覆盖AWS EMR主节点上的默认aws-sdk jar

时间:2017-01-16 22:20:51

标签: java amazon-web-services apache-spark amazon-emr

我遇到了在EMR主节点上运行我的应用程序的问题。它需要访问ver 1.11中添加的一些AWS SDK方法。所有必需的依赖项被捆绑到一个胖jar中,应用程序在我的开发框中按预期工作。

但是,如果应用程序在EMR主节点上执行,则在调用AWS SDK ver 1.11+中添加的方法时,它会因NoSuchMethodError异常而失败,例如

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

我将其跟踪到传递给JVM实例的classpath参数,由spark-submit:

启动
-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-java-sdk/aws-java-sdk-sqs-1.10.75.1.jar而不是使用我的胖罐中的ver 1.11.77。

有没有办法强制Spark使用我需要的AWS SDK版本?

1 个答案:

答案 0 :(得分: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-path spark-submit参数中指定:

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