我遇到了在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版本?
答案 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/*'