Apache spark Scala+;SBT-如何为着色Akka库配置reference.conf TL;博士
我正在尝试为Apache spark Scala+;SBT-如何为着色Akka库配置reference.conf TL;博士,apache-spark,akka,cloudera-cdh,sbt-assembly,shading,Apache Spark,Akka,Cloudera Cdh,Sbt Assembly,Shading,我正在尝试为akka库的一个版本添加阴影,并将其与我的应用程序捆绑在一起(以便能够在cdh5.7版本的spark1.6上运行spray can服务器)。在着色过程中,在手动为着色的akka提供了单独版本的reference.conf之后,看起来这两个版本还是有点混淆 明暗处理akka版本是否会导致问题?我做错了什么 背景 我有一个Scala/Spark应用程序当前运行在Spark 1.6.1单机版上。应用程序使用spray 1.3.3运行http服务器,该服务器需要akka 2.3.9(Spar
akka
库的一个版本添加阴影,并将其与我的应用程序捆绑在一起(以便能够在cdh5.7
版本的spark1.6
上运行spray can
服务器)。在着色过程中,在手动为着色的akka
提供了单独版本的reference.conf
之后,看起来这两个版本还是有点混淆
明暗处理akka
版本是否会导致问题?我做错了什么
背景
我有一个Scala
/Spark
应用程序当前运行在Spark 1.6.1
单机版上。应用程序使用spray 1.3.3
运行http服务器,该服务器需要akka 2.3.9
(Spark 1.6.1
独立版包括兼容的akka 2.3.11
)
我正在尝试将应用程序迁移到一个新的Spark
集群,该集群运行cdh5.7
版本的spark1.6
。问题在于CDH 5.7
中的Spark 1.6
与akka 2.2.3
捆绑在一起,这不足以使spray 1.3.3
正常工作
尝试解决方案
根据中的建议,我决定对akka 2.3.9进行着色,并将其与我的应用程序捆绑在一起。虽然这次我偶然发现了一个新问题-akka
在reference.conf
文件中定义了它的默认配置,该文件应该位于应用程序的类路径上。由于insbt组件的着色功能,着色的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
好的,我终于解决了这个问题
结果是,akka
使用定义为字符串文本的键从配置文件加载(一些)配置设置。例如,你可以在中找到很多
而且,sbt assembly
似乎没有以字符串文字形式更改对着色库/包名称的引用
此外,一些配置键正在通过sbt assembly
的着色进行更改。我还没有真正花时间找到它们在akka
的源代码中的确切定义位置和定义方式,但是在ActorSystem
init code期间抛出的以下异常证明了情况确实如此:
ConfigException$Missing: No configuration setting found for key 'akka_2_3_9_shade'
因此,解决方案需要包含一个自定义配置文件(例如称之为akka\u spray\u shade.conf
),并在其中复制以下配置部分:
akka
的原始reference.conf
的内容,但是在配置值中将akka
前缀更改为akka\u 2\u 3\u 9\u shade
。(这是硬编码字符串文字配置键所必需的)
akka
的原始reference.conf
的内容,但是在配置值中将akka
前缀更改为akka_2_3_9_shade
,并将根配置键从akka
更改为akka_2_3_9_shade
。(这是由sbt组件修改的配置键所必需的)
spray
的原始内容reference.conf
,但配置值中的akka
前缀更改为akka\u 2\u 3\u 9\u shade
。(这是为了确保喷雾
始终指阴影akka
)
现在,在应用程序的Boot.scala
code:
val akkaShadeConfig = ConfigFactory.load("akka_spray_shade")
implicit val system = ActorSystem("custom-actor-system-name", akkaShadeConfig)
对公认答案的一点补充
无需将此配置放入自定义命名文件中,如akka\u spray\u shade.conf
。可以将配置放入application.conf
,在创建ActorSystem
过程中,当未明确指定自定义配置时,默认情况下会加载该配置:ActorSystem(“自定义actor系统名称”)
有效地表示ActorSystem(“自定义actor系统名称”),ConfigFactory.load(“应用程序”))
这项技术很有效,但如果akka键发生变化,或者即使您引入了自己的akka设置,祝您好运。正确的解决方案是以编程方式对配置键进行“着色”sbt组件
似乎还没有提供这样的功能;也许可以通过sbt自己做。
val akkaShadeConfig = ConfigFactory.load("akka_spray_shade")
implicit val system = ActorSystem("custom-actor-system-name", akkaShadeConfig)