apache-spark - Scala + SBT - 如何为着色的 Akka 库配置 reference.conf

标签 apache-spark akka cloudera-cdh sbt-assembly shading

TL; 博士
我正在尝试遮蔽 akka 的一个版本库并将其与我的应用程序捆绑在一起(以便能够在 spray-can 版本的 CDH 5.7 上运行 Spark 1.6 服务器)。着色过程messes up akka 's default configuration ,并在手动提供单独版本的 akka 之后的 reference.conf对于阴影 akka ,看起来这两个版本仍然以某种方式混淆了。
正在着色akka已知会导致问题的版本?我究竟做错了什么?
背景
我有一个 Scala/Spark当前正在运行的应用程序 Spark 1.6.1独立。应用程序运行 spray-can http 服务器使用 spray 1.3.3 ,这需要 akka 2.3.9 ( Spark 1.6.1 独立版包括兼容的 akka 2.3.11 )。
我正在尝试将应用程序迁移到新的 Cloudera 基于 Spark运行 CDH 5.7 的集群Spark 1.6 的版本.问题是Spark 1.6CDH 5.7akka 2.2.3 捆绑在一起这对于 spray 1.3.3 来说是不够的正常运行。
尝试的解决方案
遵循 this post 中的建议,我决定遮阴akka 2.3.9并将其与我的应用程序捆绑在一起。虽然这次我偶然发现了一个新问题 - akkareference.conf 中定义了它的默认配置文件,该文件应位于应用程序的类路径中。由于known issuesbt-assembly的阴影功能,似乎阴影akka库需要单独的配置。
所以,我结束了阴影 akka使用以下阴影规则:

ShadeRule.rename("akka.**" -> "akka_2_3_9_shade.@1")
    .inLibrary("com.typesafe.akka" % "akka-actor_2.10" % "2.3.9")
    .inAll
并包括一个额外的 reference.conf我的项目中的文件,与 akka 相同的原创reference.conf ,但所有出现的“akka”都替换为“akka_2_3_9_shade”。
不过,现在看来 Spark -提供 akka以某种方式与阴影混淆 akka ,因为我收到以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: Cannot instantiate MailboxType [akka.dispatch.UnboundedMailbox], defined in [akka.actor.default-mailbox], make sure it has a public constructor with [akka.actor.ActorSystem.Settings, com.typesafe.config.Config] parameters
    at akka_2_3_9_shade.dispatch.Mailboxes$$anonfun$1.applyOrElse(Mailboxes.scala:197)
    at akka_2_3_9_shade.dispatch.Mailboxes$$anonfun$1.applyOrElse(Mailboxes.scala:195)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)
    at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:185)
    at scala.util.Try$.apply(Try.scala:161)
    at scala.util.Failure.recover(Try.scala:185)
    at akka_2_3_9_shade.dispatch.Mailboxes.lookupConfiguration(Mailboxes.scala:195)
    at akka_2_3_9_shade.dispatch.Mailboxes.lookup(Mailboxes.scala:78)
    at akka_2_3_9_shade.actor.LocalActorRefProvider.akka$actor$LocalActorRefProvider$$defaultMailbox$lzycompute(ActorRefProvider.scala:561)
    at akka_2_3_9_shade.actor.LocalActorRefProvider.akka$actor$LocalActorRefProvider$$defaultMailbox(ActorRefProvider.scala:561)
    at akka_2_3_9_shade.actor.LocalActorRefProvider$$anon$1.<init>(ActorRefProvider.scala:568)
    at akka_2_3_9_shade.actor.LocalActorRefProvider.rootGuardian$lzycompute(ActorRefProvider.scala:564)
    at akka_2_3_9_shade.actor.LocalActorRefProvider.rootGuardian(ActorRefProvider.scala:563)
    at akka_2_3_9_shade.actor.LocalActorRefProvider.init(ActorRefProvider.scala:618)
    at akka_2_3_9_shade.actor.ActorSystemImpl.liftedTree2$1(ActorSystem.scala:619)
    at akka_2_3_9_shade.actor.ActorSystemImpl._start$lzycompute(ActorSystem.scala:616)
    at akka_2_3_9_shade.actor.ActorSystemImpl._start(ActorSystem.scala:616)
    at akka_2_3_9_shade.actor.ActorSystemImpl.start(ActorSystem.scala:633)
    at akka_2_3_9_shade.actor.ActorSystem$.apply(ActorSystem.scala:142)
    at akka_2_3_9_shade.actor.ActorSystem$.apply(ActorSystem.scala:109)
    at akka_2_3_9_shade.actor.ActorSystem$.apply(ActorSystem.scala:100)
    at MyApp.api.Boot$delayedInit$body.apply(Boot.scala:45)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:71)
    at scala.App$$anonfun$main$1.apply(App.scala:71)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32)
    at scala.App$class.main(App.scala:71)
    at MyApp.api.Boot$.main(Boot.scala:28)
    at MyApp.api.Boot.main(Boot.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassCastException: interface akka_2_3_9_shade.dispatch.MailboxType is not assignable from class akka.dispatch.UnboundedMailbox
    at akka_2_3_9_shade.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:69)
    at akka_2_3_9_shade.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:66)
    at scala.util.Try$.apply(Try.scala:161)
    at akka_2_3_9_shade.actor.ReflectiveDynamicAccess.getClassFor(DynamicAccess.scala:66)
    at akka_2_3_9_shade.actor.ReflectiveDynamicAccess.CreateInstanceFor(DynamicAccess.scala:84)
    ... 34 more
来自我的应用程序 Boot.scala 的相关代码文件如下:
[45]    implicit val system = ActorSystem()
...
[48]    val service = system.actorOf(Props[MyAppApiActor], "MyApp.Api")
...
[52]    val port = config.getInt("MyApp.server.port")
[53]    IO(Http) ? Http.Bind(service, interface = "0.0.0.0", port = port)

最佳答案

好的,所以最终我设法解决了这个问题。

原来akka使用定义为字符串文字的键从配置文件加载(一些)配置设置。您可以在 akka/actor/ActorSystem.scala 中找到很多此类信息。 , 例如。

而且似乎sbt-assembly 在字符串文字中更改对阴影库/包名称的引用。

此外,一些配置键 正在更改 sbt-assembly的阴影。我还没有真正花时间去寻找它们在 akka 中的定义位置和方式。的源代码,但在 ActorSystem 期间抛出以下异常init 代码,证明确实如此:

ConfigException$Missing: No configuration setting found for key 'akka_2_3_9_shade'

因此,解决方案是包含一个自定义配置文件(例如称其为 akka_spray_shade.conf ),并在其中复制以下配置部分:
  • akka的内容的原创reference.conf ,但有 akka配置值中的前缀更改为 akka_2_3_9_shade . (这是硬编码字符串文字配置键所必需的)
  • akka的内容的原创reference.conf ,但有 akka配置值中的前缀更改为 akka_2_3_9_shade 并更改了根配置 key 来自 akkaakka_2_3_9_shade . (这是由 sbt-assembly 修改的配置键所必需的)
  • spray的内容的原创reference.conf ,但有 akka配置值中的前缀更改为 akka_2_3_9_shade . (这是确保 spray 总是指阴影 akka )
  • 所必需的

    现在,必须提供此自定义配置文件 明确 ActorSystem初始化期间在应用程序的 Boot.scala代码:
    val akkaShadeConfig = ConfigFactory.load("akka_spray_shade")
    implicit val system = ActorSystem("custom-actor-system-name", akkaShadeConfig)
    

    关于apache-spark - Scala + SBT - 如何为着色的 Akka 库配置 reference.conf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40720088/

    相关文章:

    caching - 在 Apache Spark 中缓存 RDD 的目的是什么?

    apache-spark - 如何动态选择spark.sql.shuffle.partitions

    java - Akka - ActorRef.tell() 需要几分钟来传递消息

    hadoop - 在Ubuntu 16(Oracle VM)上安装CDH 5

    sql-server - Sqoop import-all-tables 命令的问题

    hadoop - Spark : Connection refused webapp proxy on yarn

    python - 如何让scala字符串拆分以匹配python

    具有异步方法调用的 Java 服务

    java - 将 Akka 代理与更改相同数据的遗留代码混合

    java - HBase Java Client批处理/放入CDH 4.6的速度很慢