Spark无法使用pureconfig

时间:2017-04-25 12:49:51

标签: scala apache-spark shapeless pureconfig

我尝试将pureConfig和configFactory用于我的spark应用程序配置。 这是我的代码:

import pureconfig.{loadConfigOrThrow}
object Source{
  def apply(keyName: String, configArguments: Config): Source = {
    keyName.toLowerCase match {
      case "mysql" =>
          val properties = loadConfigOrThrow[DBConnectionProperties](configArguments)
          new MysqlSource(None, properties)
      case "files" =>
        val properties = loadConfigOrThrow[FilesSourceProperties](configArguments)
        new Files(properties)
      case _ => throw new NoSuchElementException(s"Unknown Source ${keyName.toLowerCase}")
    }

  }
}

import Source
val config = ConfigFactory.parseString(result.mkString("\n"))
    val source = Source("mysql",config.getConfig("source.mysql"))

当我从IDE(intelliJ)或直接从java运行它时 (即java jar ......)它工作正常。

但是当我使用spark-submit运行它时会失败并出现以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: shapeless.Witness$.mkWitness(Ljava/lang/Object;)Lshapeless/Witness;

通过快速搜索,我发现了类似于question的类似内容。 这表明原因是由于spark和pureConfig都取决于Shapeless,但版本不同,

我按照答案中的建议尝试了shade it

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("shapeless.**" -> "shadeshapless.@1")
    .inLibrary("com.github.pureconfig" %% "pureconfig" % "0.7.0").inProject
)

但它也不起作用 这可能是出于不同的原因吗? 知道什么可行吗?

由于

1 个答案:

答案 0 :(得分:3)

除了pureconfig:

之外,你还必须在自己的JAR中遮挡无形状
assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("shapeless.**" -> "shadeshapless.@1")
    .inLibrary("com.chuusai" % "shapeless_2.11" % "2.3.2")
    .inLibrary("com.github.pureconfig" %% "pureconfig" % "0.7.0")
    .inProject
)

确保添加正确的无形版本。