scala - Spark 无法与 pureconfig 一起使用

标签 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
)

但是效果不太好 难道是别的原因? 知道什么可行吗?

谢谢

最佳答案

除了 pureconfig 之外,您还必须在自己的 JAR 中使用 shapeless:

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
)

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

关于scala - Spark 无法与 pureconfig 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43611147/

相关文章:

java - 小数值以科学计数法显示 - HBase (Phoenix)

scala - 如何使用一元类型构造函数推断无形状记录值的内部类型?

scala - 将 Maven 文档集添加到 zeal

android - Android 上的 Scala : best strategy for avoiding global data?

hadoop - 在 Yarn 上运行时,容器/资源分配在 Hadoop 和 Spark 中意味着什么?

excel - Spark 驱动器意外停止并正在重新启动。您的笔记本将自动重新附加

scala - Scala 编译期间出现内存不足错误

scala - Shapeless:使用 Record 批量更新

scala - 如何通过在Scala集合中使用多个列进行分组

json - 在 Scala 中读取 JSON 文件并从中创建映射的更惯用方法