Den*_*nko 7 java amazon-web-services amazon-emr apache-spark
我在 EMR 主节点上运行应用程序时遇到问题。它需要访问1.11版本中添加的一些AWS SDK方法。所有必需的依赖项都捆绑到一个 fat jar 中,并且该应用程序在我的开发盒上按预期工作。
但是,如果应用程序在 EMR 主节点上执行,则在调用 AWS SDK 版本 1.11+ 中添加的方法时,它会失败并出现 NoSuchMethodError 异常,例如
java.lang.NoSuchMethodError:
com.amazonaws.services.sqs.model.SendMessageRequest.withMessageDeduplicationId(Ljava/lang/String;)Lcom/amazonaws/services/sqs/model/SendMessageRequest;
Run Code Online (Sandbox Code Playgroud)
我追踪到传递给 JVM 实例的类路径参数,由 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/
Run Code Online (Sandbox Code Playgroud)
特别是,它加载 /usr/share/aws/aws-java-sdk/aws-java-sdk-sqs-1.10.75.1.jar,而不是使用我的 fat jar 中的版本 1.11.77。
有没有办法强制 Spark 使用我需要的 AWS SDK 版本?
这是我在尝试解决此问题时学到的知识。
默认类路径参数是使用来自 的spark.driver.extraClassPath 设置构造的/etc/spark/conf/spark-defaults.conf。Spark.driver.extraClassPath 包含对旧版本 AWS SDK 的引用,该 SDK 位于/usr/share/aws/aws-java-sdk/*
为了使用较新版本的 AWS API,我将 jar 上传到我在主目录中创建的目录,并在--driver-class-path spark-submit参数中指定它:
--driver-class-path '/home/hadoop/aws/*'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2249 次 |
| 最近记录: |