我有一个javajar,来自一个java程序,如果我在intellijidea中本地运行java程序,它运行得很好。
当我把java程序编译成jar文件时。如果我以 java -cp jarFileName.jar com.pathToclass.ClassName inputArguments
,效果很好。
然而,当我以 spark-submit --master local[4] --class com.pathToclass.ClassName jarFileName.jar inputArguments
,当java代码运行到 read.textFile
功能。
代码如下:
DataFrameReader read = spark.read();
JavaRDD<String> stringJavaRDD = read.textFile(inputPath).javaRDD();
在inputpath中,有一些csv文件。与一起运行时的错误消息 spark-submit
具体如下:
org.apache.spark.sql.AnalysisException: Multiple sources found for text (org.apache.spark.sql.execution.datasources.v2.text.TextDataSourceV2, org.apache.spark.sql.execution.datasources.text.TextFileFormat), please specify the fully qualified class name.;
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:707)
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSourceV2(DataSource.scala:733)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:248)
at org.apache.spark.sql.DataFrameReader.text(DataFrameReader.scala:843)
at org.apache.spark.sql.DataFrameReader.textFile(DataFrameReader.scala:880)
at org.apache.spark.sql.DataFrameReader.textFile(DataFrameReader.scala:852)
at com.three2three.bigfoot.vola.NormalizeSnapshotSigmaAxisImpliedVola.main(NormalizeSnapshotSigmaAxisImpliedVola.java:306)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:928)
at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:180)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:203)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:90)
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:1007)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1016)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
我尝试在intellijidea中进行本地调试,在idea中运行时,发现数据源 org.apache.spark.sql.execution.datasources.text.TextFileFormat
.
似乎当你像 spark-submit
, this.source()
是 text
,scala代码找到了两个数据源:
org.apache.spark.sql.execution.datasources.v2.text.TextDataSourceV2
org.apache.spark.sql.execution.datasources.text.TextFileFormat
为什么会这样?为什么代码只在运行时失败 spark-submit
模式,并成功地在其他运行方式?如何解决磨合误差 spark-submit
模式?
我测试了跑步 spark-submit
. 它在一台linux服务器上工作,但在我的windows pc和另一台linux服务器(使用不同版本的hadoop和spark)上失败。
更新,在一些帖子中,声称如果指定格式,例如 mutiple source found for ...
错误是可以避免的。e、 g.在这篇文章中:https://github.com/absaoss/abris/issues/147,它们是硬编码的
df = (
spark
.readStream
.schema(stream_schema)
.format("org.apache.spark.sql.execution.datasources.json.JsonFileFormat")
.load("path_to_stream_directory")
)
“multi-soruce found for json”错误消失了。类似的,我看到了关于csv格式的帖子。但我尝试了硬编码格式在我的情况下,它也不工作。
1条答案
按热度按时间vshtjzan1#
我找到了解决办法。“multiple sources found for…”表示在中提交spark作业时,可以找到多个用于读取文本/csv文件的包
spark-submit
.因此,很可能已经找到了用于读取文本/csv文件的库的多个版本。
我假设原因如下:我用gradle在带有特定hadoop/spark版本的windows pc上编译了java代码。我已经跑完了
spark-submit --comeCofigaration myjar.jar --some parameters
本地在我的windows pc和不同的linux服务器上。gradle.build文件中指定的版本可能与我的windows pc上的版本不同。很明显,它与其中一台linux服务器上的版本相同,而与另一台linux服务器上的版本不同。这就是为什么spark-submit
作业仅在其中一台linux服务器上成功,而在另一台和windows pc上失败。在意识到可能存在版本冲突的问题后,我在pc/linux和linux上重新安装了最新版本
spark-submit
工作良好,没有错误的“多重来源发现…”。我目前使用的版本如下:
hadoop:hadoop-3.2.2
spark:spark-3.1.1-bin-hadoop3.2
java:openjdk版本“1.8.0282”(java 8)
Flume:apache-flume-1.9.0-bin
Kafka:Kafka2.13-2.7.0
scala:scala-2.12.13.deb
sbt:sbt-1.5.0.tgz型
我不确定我的答案是否正确,因为我对hadoop/spark/java还比较陌生。如果有人知道详细的原因,请张贴你的答案。