Spark не работает с 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;
Из быстрого поиска я нашел похожее на этот вопрос. которые предполагают, что причина этого в том, что и spark, и pureConfig зависят от Shapeless, но с разными версиями,
Я пытался затенить это, как предложено в ответе
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("shapeless.**" -> "shadeshapless.@1")
.inLibrary("com.github.pureconfig" %% "pureconfig" % "0.7.0").inProject
)
но это не сработало, может ли это быть по другой причине? Есть идеи, что может работать?
Спасибо
1 ответ
Вы также должны затенять бесформенное внутри собственного JAR-файла, в дополнение к pureconfig:
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
)
Обязательно добавьте правильную бесформенную версию.