spark找到多个文本源

wfsdck30  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(615)

我有一个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格式的帖子。但我尝试了硬编码格式在我的情况下,它也不工作。

vshtjzan

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还比较陌生。如果有人知道详细的原因,请张贴你的答案。

相关问题