【问题标题】:Failed to load com.databricks.spark.csv while running with spark-submit使用 spark-submit 运行时无法加载 com.databricks.spark.csv
【发布时间】:2017-04-08 18:48:59
【问题描述】:

我正在尝试使用以下命令通过 spark-submit 运行我的代码。

spark-submit --class "SampleApp" --master local[2] target/scala-2.11/sample-project_2.11-1.0.jar

我的 sbt 文件具有以下依赖项:

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.1"

libraryDependencies += "org.apache.spark" % "spark-sql_2.11" % "1.5.2"

libraryDependencies += "com.databricks" % "spark-csv_2.11" % "1.2.0"

我的代码:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import scala.collection.mutable.ArrayBuffer 
import org.apache.spark.sql.SQLContext

object SampleApp {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("Sample App").setMaster("local[2]")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc) 

    import sqlContext._ 
    import sqlContext.implicits._

    val df = sqlContext.load("com.databricks.spark.csv", Map("path" -> "/root/input/Account.csv", "header" -> "true"))

    val column_names = df.columns
    val row_count = df.count
    val column_count = column_names.length

    var pKeys = ArrayBuffer[String]()

    for ( i <- column_names){
         if (row_count == df.groupBy(i).count.count){
             pKeys += df.groupBy(i).count.columns(0)
         }
     }

    pKeys.foreach(print)
  }
}

错误:

16/03/11 04:47:37 INFO BlockManagerMaster: Registered BlockManager
Exception in thread "main" java.lang.RuntimeException: Failed to load class for data source: com.databricks.spark.csv
    at scala.sys.package$.error(package.scala:27)
    at org.apache.spark.sql.sources.ResolvedDataSource$.lookupDataSource(ddl.scala:220)
    at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:233)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:114)
    at org.apache.spark.sql.SQLContext.load(SQLContext.scala:1253)

我的 Spark 版本是 1.4.1,Scala 是 2.11.7

(我正在关注此链接:http://www.nodalpoint.com/development-and-deployment-of-spark-applications-with-scala-eclipse-and-sbt-part-1-installation-configuration/

我尝试过以下版本的 spark csv

spark-csv_2.10 1.2.0
1.4.0 
1.3.1
1.3.0
1.2.0
1.1.0
1.0.3
1.0.2
1.0.1
1.0.0

等等

请帮忙!

【问题讨论】:

  • 对于初学者来说,你的依赖关系搞砸了。 SQL 版本应与核心版本匹配。
  • @zero323 谢谢,我会尝试匹配它们。但它无法加载数据:(
  • Next SQLContext.load 方法已在 1.4.1 中弃用。请改用DataFrameReader 方法。
  • 另外,您是否使用 Scala 2.11 构建了 Spark?
  • 我使用了以下命令: build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Dscala-2.11 -DskipTests clean package 现在将 SQL 版本更改为 1.4.1,可以继续使用DataFrameReader 感谢您的建议!

标签: scala apache-spark sbt


【解决方案1】:

由于您在本地模式下运行作业,请使用 --jar 选项添加外部 jar 路径

spark-submit --class "SampleApp" --master local[2] --jar 文件:[path-of-spark-csv_2.11.jar],文件:[path-of-other-依赖jar] target/scala-2.11/sample-project_2.11-1.0.jar

例如

spark-submit --jars file:/root/Downloads/jars/spark-csv_2.10-1.0.3.jar,file:/root/Downloads/jars/com‌​mons-csv-1.2.jar,file:/root/Downloads/jars/spark-sql_2.11-1.4.1.jar --class "SampleApp" --master local[2] target/scala-2.11/my-proj_2.11-1.0.jar

您可以做的另一件事是创建一个胖罐。在 SBT 中你可以试试这个 proper-way-to-make-a-spark-fat-jar-using-sbt 并在 Maven 中参考 create-a-fat-jar-file-maven-assembly-plugin

注意: 将 Spark 的(即 spark-core、spark-streaming、spark-sql 等)jar 的范围标记为 provided 否则胖 jar 将变得太胖而无法部署.

【讨论】:

  • 这行得通,非常感谢,但现在我得到 java.lang.NoClassDefFoundError: org/apache/commons/csv/CSVFormat\
  • 使用的命令是:spark-submit --class "SampleApp" --master local[2] --jars file:/root/Downloads/jars/spark-csv_2.10-1.0.3 .jar,/root/Downloads/jars/commons.csv-1.2.jar,/root/Downloads/jars/spark-sql_2.11-1.4.1.jar 目标/scala-2.11/my-proj_2.11-1.0。罐子
  • spark-csv_2.11.jar 取决于 org.apache.commons » commons-csv 所以你还必须添加 commons-csv.jar 到。为了解决这个依赖问题,我更新了答案。
  • 尝试更新命令:spark-submit --class "SampleApp" --master local[2] --jars file://root/Downloads/jars/spark-csv_2.10-1.0.3.jar,file://root/Downloads/jars/commons.‌​csv-1.2.jar,file://root/Downloads/jars/spark-sql_2.11-1.4.1.jar target/scala-2.11/my-proj_2.11-1.0.jar,为文件协议添加了额外的/
  • 在命令下面的几个路径工作后,file://root... 无法读取 jar 的位置,请使用以下语法更新答案,再次感谢!使用的命令:spark-submit --jars file:/root/Downloads/jars/spark-csv_2.10-1.0.3.jar,file:/root/Downloads/jars/commons-csv-1.2.jar,file:/ root/Downloads/jars/spark-sql_2.11-1.4.1.jar --class "SampleApp" --master local[2] target/scala-2.11/my-proj_2.11-1.0.jar
【解决方案2】:

更好的解决方案是使用--packages 选项,如下所示。

spark-submit --class "SampleApp" --master local[2] --packages com.databricks:spark-csv_2.10:1.5.0 target/scala-2.11/sample-project_2.11-1.0.jar

确保--packages 选项位于应用程序jar 之前

【讨论】:

    【解决方案3】:

    您已将 spark-csv 库添加到您的 sbt 配置中 - 这意味着您可以使用它编译您的代码,

    但这并不意味着它存在于运行时(spark sql 和 spark core 默认存在)

    所以尝试使用 spark-submit 的 --jars 选项将 spark-csv jar 添加到运行时类路径,或者您可以构建 fat-jar(不确定您是如何使用 sbt 进行的)

    【讨论】:

    • 他把它编译到了他的jar中,所以它应该在那里(注意他没有使用provided,确实会省略它)
    • @DanielZolnai,我可能错了,但你需要这个 sbt-assembly、sbt-proguard、sbt-onejar 的特殊插件。默认情况下,简单的 'sbt package' 3'd 派对 jar 不会被组装到 jar 中。
    • 你可能是对的,我以为他在使用汇编。
    • 非常感谢您的解决方案,现在我收到 java.lang.NoClassDefFoundError: org/apache/commons/csv/CSVFormat\ ,对此有什么想法吗?
    • 我使用过:spark-submit --class "SampleApp" --master local[2] --jars 文件:/root/Downloads/jars/spark-csv_2.10-1.0.3。 jar,/root/Downloads/jars/commons.csv-1.2.jar,/root/Downloads/jars/spark-sql_2.11-1.4.1.jar 目标/scala-2.11/my-proj_2.11-1.0.jar
    【解决方案4】:

    您正在使用 Spark 1.3 将 CSV 文件加载到数据框中的语法。

    如果您检查repository here,则应在 Spark 1.4 及更高版本上使用以下语法:

    val df = sqlContext.read
        .format("com.databricks.spark.csv")
        .option("header", "true") // Use first line of all files as header
        .option("inferSchema", "true") // Automatically infer data types
        .load("cars.csv")
    

    【讨论】:

    • 感谢您的建议,我已经更改了语法!
    【解决方案5】:

    我正在寻找一个可以跳过 --packages 选项并直接在程序集 jar 中提供的选项。我遇到这个异常的原因是 sqlContext.read.format("csv") 这意味着它应该知道 csv 的数据格式。相反,要指定 csv 格式存在的位置,请使用 sqlContext.read.format("com.databricks.spark.csv"),这样它就知道在哪里查找它并且不会引发异常。

    【讨论】:

      猜你喜欢
      • 2017-04-30
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      相关资源
      最近更新 更多