使用spark-submit部署程序时出现java.lang.NoSuchMethodError

时间:2019-04-19 03:07:38

标签: java apache-spark hadoop amazon-s3

我正在编写一个程序以将数据上传到某些s3a://链接。该程序通过mvn install进行编译。在本地运行程序(如使用java -jar jarfile.jar一样)没有返回错误。但是,当我使用spark-submit(如使用spark-submit jarfile.jar)时,它返回了以下错误:

  

线程“主”中的异常java.lang.NoSuchMethodError:   org.apache.hadoop.conf.Configuration.reloadExistingConfigurations()V           在org.apache.hadoop.fs.s3a.S3AFileSystem.addDeprecatedKeys(S3AFileSystem.java:181)           在org.apache.hadoop.fs.s3a.S3AFileSystem。(S3AFileSystem.java:185)           在java.lang.Class.forName0(本地方法)           在java.lang.Class.forName(Class.java:348)           ...

错误日志可以追溯到我的源代码的这一部分:

sparkDataset
        .write()
        .format("parquet")
        .mode(SaveMode.Overwrite)
        .save("some s3a:// link");

其中sparkDatasetorg.apache.spark.sql.Dataset的实例。

尝试How to access s3a:// files from Apache Spark?失败,并返回了另一个错误,例如:

  

线程“主”中的异常java.lang.NoClassDefFoundError:   org / apache / hadoop / fs / GlobalStorageStatistics $ StorageStatisticsProvider

java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations()V中的问题也不大可能发生,因为我可以在本地运行,而兼容性不是问题。

此外,这些是我使用的相关库的版本:

  • aws-java-sdk-bundle:1.11.199
  • hadoop-aws:3.0.0

我希望通过s3a://链接写入文件。我认为依赖不是问题,因为我可以在本地运行。我只有在使用spark-submit来运行此程序时才遇到此问题。有人对如何解决这个问题有任何想法吗?

编辑:此外,我检查了spark提交的spark版本是否据说是针对hadoop 2.7及更高版本构建的。我严格使用hadoop 3.0.0。难道这就是为什么我的程序中发生此类错误的线索?

1 个答案:

答案 0 :(得分:0)

Run spark-submit with my own build of hadoop的答案似乎在指导我寻找自己的解决方案。

基于我的理解,出于某些未知原因*,发行版“ spark-2.4.0-bin-hadoop2.7.tgz”提供的spark-submit将排除在您的应用程序中一起编译的所有hadoop程序包

之所以引发NoSuchMethodError错误是因为直到Hadoop版本2.8.x才存在方法reloadExistingConfiguration。似乎在编写实木复合地板的过程中会以某种方式调用此特定方法。

我的解决方案是在将其连接到hadoop 3.0.0时使用单独的'spark-2.4.0-without-hadoop.tgz'发行版,以便即使spark-submit排除了在执行期间将其打包到您的应用程序中。

此外,由于无论如何都将通过spark-submit排除软件包,因此在通过Maven进行编译时,我不会创建胖子。相反,我将在执行期间使用标志--packages来指定运行我的应用程序所需的依赖项。