您的耐心基础能力:java.lang.NoSuchMethodError

Spark uses s3a: java.lang.NoSuchMethodError

我正在做一些关于 spark_with_hadoop2.7 (2.4.3)、hadoop (3.2.0) 和 Ceph luminous 的组合的事情。当我尝试使用 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)

对于NoSuchMethodError,根据how-do-i-fix-a-nosuchmethoderror.[=23=,很可能是编译的class版本与运行class版本不同]

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

1,复制这两个jar到$SPARK_HOME/jars
2、修改$HADOOP_HOME/etc/hadoop/hadoop-env.sh,增加如下语句:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/*

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

但是为什么当我调用 spark 时会抛出关于 aws s3a 的异常?

所有 hadoop-* JAR 都需要 100% 匹配版本,否则您会看到这样的堆栈跟踪。

更多信息请重读