【问题标题】:Spark Multiple sources found for textSpark 为文本找到多个来源
【发布时间】:2021-06-14 06:22:11
【问题描述】:

我有一个来自 Java 程序的 Java jar,如果我在 IntelliJ IDEA 中本地运行 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)

我尝试在IntelliJ IDEA中本地调试,在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 ...这样的错误。 例如在这篇文章中: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")
)

“为 json 找到多源”错误消失了。同样,我看到了有关 csv 格式的帖子。但在我的情况下,我尝试使用硬编码格式,它也不起作用。

【问题讨论】:

  • 使用spark-submit 运行时,在Linux 服务器上运行时效果很好。但是,在 Windows 电脑上运行时失败,错误消息Spark Multiple sources found for text
  • 我安装了最新版本的 spark、hadoop 和 java。现在同样的错误再次发生。我的版本是 Debian 10, hadoop-3.2.2, java: openjdk version "1.8.0_282" , spark: spark.3.1.1-bin-hadoop3.2
  • “为镶木地板找到多个来源”的类似错误:issues.apache.org/jira/browse/SPARK-24427,以及“为 csv 找到多个来源”:stackoverflow.com/questions/50884599/…
  • 错误似乎来自源代码:issues.apache.org/jira/browse/SPARK-20590

标签: java scala apache-spark apache-spark-sql


【解决方案1】:

我找到了解决办法。 “Multiple sources found for ...”表示在spark-submit提交spark作业时发现了多个用于读取text/csv文件的包。

所以,很可能已经找到了用于读取 text/csv 文件的多个版本的库。

我认为原因如下: 我在具有特定 hadoop/spark 版本的 Windows pc 上使用 gradle 编译了我的 java 代码。我已经在我的 Windows PC 和不同的 linux 服务器上本地运行了spark-submit --someCofigaration myjar.jar --some parameters。 gradle.build 文件中指定的版本可能与我的 Windows 电脑上的不同。幸运的是,它与一台 linux 服务器上的版本相同,而与另一台 linux 服务器上的版本不同。这就是为什么spark-submit 作业只在一台 linux 服务器上成功,而在另一台和 Windows pc 上失败。

意识到这可能是版本冲突的问题后,我在我的 pc/linux 上重新安装了最新版本,spark-submit 运行良好,没有出现“为...找到多个源”的错误。

我目前使用的版本如下:

Hadoop:hadoop-3.2.2

火花:spark-3.1.1-bin-hadoop3.2

java:openjdk 版本“1.8.0_282”(Java 8)

Flume:apache-flume-1.9.0-bin

卡夫卡:kafka_2.13-2.7.0

Scala:scala-2.12.13.deb

sbt: sbt-1.5.0.tgz

我不确定我的答案是否确实正确,因为我对 hadoop/spark/java 比较陌生。如果有人知道详细原因,请发布您的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2018-12-27
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多