我正在编写一个程序以将数据上传到某些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");
其中sparkDataset
是org.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中的问题也不大可能发生,因为我可以在本地运行,而兼容性不是问题。
此外,这些是我使用的相关库的版本:
我希望通过s3a://链接写入文件。我认为依赖不是问题,因为我可以在本地运行。我只有在使用spark-submit来运行此程序时才遇到此问题。有人对如何解决这个问题有任何想法吗?
编辑:此外,我检查了spark提交的spark版本是否据说是针对hadoop 2.7及更高版本构建的。我严格使用hadoop 3.0.0。难道这就是为什么我的程序中发生此类错误的线索?
答案 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
来指定运行我的应用程序所需的依赖项。