您的耐心基础能力: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.jar
和 hadoop-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% 匹配版本,否则您会看到这样的堆栈跟踪。
更多信息请重读
我正在做一些关于 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.jar
和 hadoop-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% 匹配版本,否则您会看到这样的堆栈跟踪。
更多信息请重读