spark-csv的spark-submit依赖项解析

时间:2017-04-07 03:56:22

标签: java scala apache-spark

我正在做小scala程序,它将csv转换为镶木地板。 我正在使用databricks spark-csv。 这是我的build.sbt

name: = "tst"

version: = "1.0"

scalaVersion: = "2.10.5"

libraryDependencies++ = Seq(
  "org.apache.spark" % % "spark-core" % "1.6.1" % "provided",
  "org.apache.spark" % % "spark-sql" % "1.6.1",
  "com.databricks" % "spark-csv_2.10" % "1.5.0",
  "org.apache.spark" % % "spark-hive" % "1.6.1",
  "org.apache.commons" % "commons-csv" % "1.1",
  "com.univocity" % "univocity-parsers" % "1.5.1",
  "org.slf4j" % "slf4j-api" % "1.7.5" % "provided",
  "org.scalatest" % % "scalatest" % "2.2.1" % "test",
  "com.novocode" % "junit-interface" % "0.9" % "test",
  "com.typesafe.akka" % "akka-actor_2.10" % "2.3.11",
  "org.scalatest" % % "scalatest" % "2.2.1",
  "com.holdenkarau" % % "spark-testing-base" % "1.6.1_0.3.3",
  "com.databricks" % "spark-csv_2.10" % "1.5.0",
  "org.joda" % "joda-convert" % "1.8.1"

)

sbt package之后,当我运行命令

spark-submit --master local[*] target/scala-2.10/tst_2.10-1.0.jar

我收到以下错误。

Exception in thread "main" java.lang.ClassNotFoundException: Failed to find data source: com.databricks.spark.csv. Please find packages at http://spark-packages.org

我可以看到com.databricks_spark-csv_2.10-1.5.0.jar命令下载~/.ivy2/jars/中的sbt package文件

dataconversion.scala

的源代码

import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object dataconversion {
  def main(args: Array[String]) {
    val conf =
      new SparkConf()
      .setAppName("ClusterScore")
      .set("spark.storage.memoryFraction", "1")

    val sc = new SparkContext(conf)
    val sqlc = new SQLContext(sc)
    val df = sqlc.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("/tmp/cars.csv")
    println(df.printSchema)
  }

}

如果我使用显式spark-submit路径指定--jars选项,我可以jar无错误地执行。但那并不理想。请建议。

2 个答案:

答案 0 :(得分:1)

使用sbt-assembly插件构建一个"胖罐"通过sbt assembly包含所有您的依赖关系,然后在其上调用spark-submit

一般情况下,当您获得ClassNotFoundException时,请尝试使用jar tvf target/scala-2.10/tst_2.10-1.0.jar展开您创建的jar以查看其中的内容。检查常春藤缓存中的内容是没有意义的;这只是告诉你SBT找到了它。正如数学家所说,这是必要但不充分的。

答案 1 :(得分:0)

所需的库是必需的,因此您可以选择:

  1. com.databricks_spark-csv_2.10-1.5.0.jar放在本地或hdfs中 可到达的路径,并提供与--jars参数
  2. 的依赖关系
  3. 使用--packages com.databricks:spark-csv_2.10:1.5.0 为您的流程提供必需的lib
  4. 使用您的依赖项构建胖jar并忘记--jars