Не удалось найти источник данных: паркет при сборке с помощью сборки sbt

У меня есть следующий код:

val testRDD: RDD[(String, Vector)] = sc.parallelize(testArray)

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._

val df = testRDD.toDF()

df.write.parquet(path)

со следующим build.sbt:

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.1"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.6.1"
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "1.6.1"

// META-INF discarding
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
{
  case "reference.conf" => MergeStrategy.concat
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case x => MergeStrategy.first
}
}

Когда я создаю это с помощью sbt-assembly (у меня есть addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")), а затем запускаю его, я получаю сообщение об ошибке:

Exception in thread "main" java.lang.ClassNotFoundException: Failed to find data source: parquet. Please find packages at http://spark-packages.org
    at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.lookupDataSource(ResolvedDataSource.scala:77)
    at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:219)
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:148)
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:139)
    at org.apache.spark.sql.DataFrameWriter.parquet(DataFrameWriter.scala:334)
    at InductionService.Application$.main(ParquetTest.scala:65)

Однако, если я соберу это с помощью IntelliJ Idea (обычная сборка, а не толстый JAR, как со сборкой sbt) и отлажу его в этой среде IDE, это действительно сработает. Так что явно что-то не так с тем, как я строю это, используя сборку sbt, но я не знаю, как это исправить. Есть идеи?

У меня есть подозрения, что причиной может быть код отбрасывания merge-inf в build.sbt, но мне нужен этот код, иначе я не смогу выполнить сборку с помощью sbt-assembly. (он жалуется на дубликаты...)


person Karl Arsenault    schedule 03.06.2016    source источник
comment
У меня такая же проблема с плагином maven-assembly.   -  person omrsin    schedule 31.08.2016


Ответы (2)


У меня была проблема с саэ. В папке services в META-INF возникли проблемы с объединением. Я мог бы исправить это, добавив правило в MergeStrategy:

case n if n.contains("services") => MergeStrategy.concat

Это то, что у меня есть, и теперь это работает:

val meta = """META.INF(.)*""".r
assemblyMergeStrategy in assembly := {
  case PathList("javax", "servlet", xs @ _*) => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
  case n if n.contains("services") => MergeStrategy.concat
  case n if n.startsWith("reference.conf") => MergeStrategy.concat
  case n if n.endsWith(".conf") => MergeStrategy.concat
  case meta(_) => MergeStrategy.discard
  case x => MergeStrategy.first
}
person rhernando    schedule 07.10.2016
comment
+ github.com/twitter/twitter-server/issues/49 для решения мета - person Pavel; 09.04.2020

Приведенное выше решение не идеально, оно частично правильное, вам нужно объединить полосу META-INF/service/.... и отбросить другие в META-INF, но приведенное выше решение делает это с case n if n.contains("service"), что является слишком общим условием. Если какой-либо дублированный файл, а не только в META-INF, содержит слово «сервис», что встречается очень часто, этот файл будет объединен, включая файлы классов. Если ваша программа или одна из ее зависимостей содержит такой класс, как com/amazonaws/services/s3/model/AmazonS3Exception, как у меня, она объединит их, что приведет к:

java.lang.ClassFormatError: Extra bytes at the end of class file com/amazonaws/services/s3/model/AmazonS3Exception

Гораздо лучше максимально ограничить предложение concat, предоставив предложение concat META-INF/services, отбросив все остальное, что является META-INF, это один из способов сделать это:

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", "services",  _*)  => MergeStrategy.concat
  case PathList("META-INF", _*) => MergeStrategy.discard
  case _ => MergeStrategy.first

}
person Roberto Congiu    schedule 23.04.2021