Spark 2.4+Hadoop3.1.1升级AWS SDK后遇NoSuchMethodError求助
问题:Spark 2.4+Hadoop3.1.1升级AWS SDK 1.12.654后遇NoSuchMethodError
我们使用Spark 2.4版本独立集群,因需将AWS SDK版本升级至1.12.654(暂不迁移至AWS SDK V2),同步升级Hadoop至3.1.1。在解决大量依赖问题后,仍卡在java.lang.NoSuchMethodError错误上,无法排查原因。
错误栈信息
Caused by: java.lang.NoSuchMethodError: com.amazonaws.http.HttpResponse.getHttpRequest()Lcom/amazonaws/thirdparty/apache/http/client/methods/HttpRequestBase; at com.amazonaws.services.s3.internal.S3ObjectResponseHandler.handle(S3ObjectResponseHandler.java:57) at com.amazonaws.services.s3.internal.S3ObjectResponseHandler.handle(S3ObjectResponseHandler.java:29) at com.amazonaws.http.response.AwsResponseHandlerAdapter.handle(AwsResponseHandlerAdapter.java:69) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1794) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleSuccessResponse(AmazonHttpClient.java:1477) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1384) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1157) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:814) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:781) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:755) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:715) at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:697) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:561) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:541) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5520) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5467) at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1554) at org.apache.hadoop.fs.s3a.S3AInputStream.lambda$reopen$0(S3AInputStream.java:183) at org.apache.hadoop.fs.s3a.Invoker.once(Invoker.java:109) at org.apache.hadoop.fs.s3a.S3AInputStream.reopen(S3AInputStream.java:182) at org.apache.hadoop.fs.s3a.S3AInputStream.lambda$lazySeek$1(S3AInputStream.java:328) at org.apache.hadoop.fs.s3a.Invoker.lambda$retry$2(Invoker.java:190) at org.apache.hadoop.fs.s3a.Invoker.once(Invoker.java:109) at org.apache.hadoop.fs.s3a.Invoker.lambda$retry$3(Invoker.java:260) at org.apache.hadoop.fs.s3a.Invoker.retryUntranslated(Invoker.java:317) at org.apache.hadoop.fs.s3a.Invoker.retry(Invoker.java:256) at org.apache.hadoop.fs.s3a.Invoker.retry(Invoker.java:188) at org.apache.hadoop.fs.s3a.Invoker.retry(Invoker.java:210) at org.apache.hadoop.fs.s3a.S3AInputStream.lazySeek(S3AInputStream.java:321) at org.apache.hadoop.fs.s3a.S3AInputStream.read(S3AInputStream.java:433) at java.io.DataInputStream.read(DataInputStream.java:149) at org.apache.hadoop.mapreduce.lib.input.UncompressedSplitLineReader.fillBuffer(UncompressedSplitLineReader.java:62) at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:218) at org.apache.hadoop.util.LineReader.readLine(LineReader.java:176) at org.apache.hadoop.mapreduce.lib.input.UncompressedSplitLineReader.readLine(UncompressedSplitLineReader.java:94) at org.apache.hadoop.mapreduce.lib.input.LineRecordReader.initialize(LineRecordReader.java:124) at org.apache.spark.sql.execution.datasources.HadoopFileLinesReader.<init>(HadoopFileLinesReader.scala:65) at org.apache.spark.sql.execution.datasources.HadoopFileLinesReader.<init>(HadoopFileLinesReader.scala:47) at org.apache.spark.sql.execution.datasources.csv.TextInputCSVDataSource$.readFile(CSVDataSource.scala:199) at org.apache.spark.sql.execution.datasources.csv.CSVFileFormat$$anonfun$buildReader$2.apply(CSVFileFormat.scala:142) at org.apache.spark.sql.execution.datasources.csv.CSVFileFormat$$anonfun$buildReader$2.apply(CSVFileFormat.scala:136) at org.apache.spark.sql.execution.datasources.FileFormat$$anon$1.apply(FileFormat.scala:148) at org.apache.spark.sql.execution.datasources.FileFormat$$anon$1.apply(FileFormat.scala:132)
已排查情况
- S3ObjectResponseHandler来自
aws-java-sdk-s3-1.12.654.jar,调用的HttpResponse来自aws-java-sdk-core-1.12.654.jar; - HttpResponse类中导入的是
org.apache.http.client.methods.HttpRequestBase,但错误提示找不到的方法返回类型为com.amazonaws.thirdparty.apache.http.client.methods.HttpRequestBase,该类存在于aws-java-sdk-bundle-1.12.654.jar中; - 已尝试排除HttpClients依赖、强制使用
aws-java-sdk-bundle,但问题仍未解决; - 查看AWS Bundle的POM文件,发现包重定位配置:
<relocations> <relocation> <pattern>org.apache.http</pattern> <shadedPattern>com.amazonaws.thirdparty.apache.http</shadedPattern> </relocation> </relocations>
不清楚为何类路径中存在该bundle时方法仍找不到,恳请提供解决思路。
内容的提问来源于stack exchange,提问作者pin
相关产品推荐
相关产品推荐

