Apache spark Spark使用s3a:java.lang.NoSuchMethodError

Apache spark Spark使用s3a:java.lang.NoSuchMethodError,apache-spark,hadoop,ceph,Apache Spark,Hadoop,Ceph,我正在做一些关于spark_与_hadoop 2.7(2.4.3)、hadoop(3.2.0)和Ceph夜光的结合的事情。当我尝试使用spark访问ceph时(例如,在shell上启动spark sql),异常如下所示: INFO impl.MetricsSystemImpl: s3a-file-system metrics system started Exception in thread "main" java.lang.NoSuchMethodError: org.apache.had

我正在做一些关于spark_与_hadoop 2.7(2.4.3)、hadoop(3.2.0)和Ceph夜光的结合的事情。当我尝试使用spark访问ceph时(例如,在shell上启动
spark sql
),异常如下所示:

 INFO impl.MetricsSystemImpl: s3a-file-system metrics system started
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.security.ProviderUtils.excludeIncompatibleCredentialProviders(Lorg/apache/hadoop/conf/Configuration;Ljava/lang/Class;)Lorg/apache/hadoop/conf/Configuration;
        at org.apache.hadoop.fs.s3a.S3AUtils.getAWSAccessKeys(S3AUtils.java:740)
        at org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider.<init>(SimpleAWSCredentialsProvider.java:58)
        at org.apache.hadoop.fs.s3a.S3AUtils.createAWSCredentialProviderSet(S3AUtils.java:600)
INFO impl.metricsystemimpl:s3a文件系统度量系统已启动
线程“main”java.lang.NoSuchMethodError中出现异常:org.apache.hadoop.security.ProviderUtils.ExcludeCompatibleCredentialProviders(Lorg/apache/hadoop/conf/Configuration;Ljava/lang/Class;)Lorg/apache/hadoop/conf/Configuration;
位于org.apache.hadoop.fs.s3a.S3AUtils.getAWSAccessKeys(S3AUtils.java:740)
位于org.apache.hadoop.fs.s3a.SimpleAwCredentialsProvider。(SimpleAwCredentialsProvider.java:58)
位于org.apache.hadoop.fs.s3a.S3AUtils.createAWSCredentialProviderSet(S3AUtils.java:600)
对于
NoSuchMethodError
,很可能是因为编译的类版本与运行的类版本不同

要访问
Ceph
,aws相关jar
aws-java-sdk-bundle-1.11.375.jar
hadoop-aws-3.2.0.jar
下的
$hadoop_HOME/share/hadoop/tools/lib
实际使用的。我做了如下操作:

1、将这两个罐子复制到
$SPARK\u HOME/jars

2、修改
$HADOOP\u HOME/etc/HADOOP/HADOOP env.sh
以添加以下语句:

export HADOOP\u CLASSPATH=$HADOOP\u CLASSPATH:$HADOOP\u HOME/share/HADOOP/tools/lib/*

通过执行上述步骤,我可以启动hdfs访问ceph,例如,我可以使用
hdfs dfs-ls
列出ceph bucket下的文件夹。这证明了与aws相关的JAR工作正常(正如我所理解的)


但是当我调用spark时,为什么会抛出aws s3a异常呢?

所有hadoop-*jar都需要在版本上100%匹配,否则就会看到这样的堆栈跟踪


有关更多信息,请重新阅读我之前检查过的@Yogesh链接的可能副本,它不能解决我的问题。根据我目前的理解,我使用的spark是spark2.4.3和内置的hadoop2.7,这应该是问题所在。我想我需要在没有hadoop版本的情况下使用spark2.4.3_。如果没有试错法,如何确定jar是否匹配?它们都有相同的后缀,比如-2.8.4或-3.1.2hi,我也有相同的错误,所以我尝试过,但有一点不清楚:我应该将所有hadoop-*-3.2.1.jar复制到spark jars文件夹吗?(我的Hadoop版本是3.2.1)(我的spark jars文件夹中有所有原始文件,版本为2.7.3)所有Hadoop-*JAR都需要在版本上100%匹配,否则会看到这样的堆栈跟踪。