TL影アッカライブラリのreference.confを構成する方法、DRを
私は日陰にakka
ライブラリのバージョンをしようと私のアプリケーションとの同梱しています(spray-can
を実行できるようにしますサーバーCDH 5.7
バージョンSpark 1.6
)。シェーディング処理messes up akka
's default configurationとakka
のreference.conf
の別のバージョンを影付きのakka
に手動で提供した後も、2つのバージョンが何らかの形で混乱しているように見えます。スカラ+ SBT -
シェーディングakka
は問題を引き起こすことが知られていますか?私は間違って何をしていますか?
背景
私は現在、Spark 1.6.1
スタンドアロンで実行されているScala
/Spark
アプリケーションを持っています。アプリケーションは、akka 2.3.9
(Spark 1.6.1
スタンドアロンにはakka 2.3.11
を含む)を必要とするspray 1.3.3
を使用してspray-can
httpサーバーを実行します。
Spark 1.6
の
CDH 5.7
バージョンを実行して新しい
Cloudera
ベース
Spark
クラスタにアプリケーションを移行しようとしています。問題は、の
Spark 1.6
が
akka 2.2.3
にバンドルされており、
spray 1.3.3
が正しく機能するには不十分です。
未遂ソリューション
はthis postでの提案に続いて、私は日陰akka 2.3.9
に決め、自分のアプリケーションと一緒に同梱。今回は新しい問題が発生しましたが、akka
は、アプリケーションのクラスパス上にあるreference.conf
ファイルで定義されているデフォルト構成を持っています。 sbt-assembly
のシェーディング機能でknown issueがあるため、影付きのakka
ライブラリには別の設定が必要なようです。
だから、私は以下のシェードルールにakka
を遮光終わった。しかし、すべてのoccurancesと、
ShadeRule.rename("akka.**" -> "[email protected]")
.inLibrary("com.typesafe.akka" % "akka-actor_2.10" % "2.3.9")
.inAll
とakka
のreference.conf
オリジナルと同じです私のプロジェクト、で追加reference.conf
ファイルを含みます " akka "は" akka_2_3_9_shade "に置き換えられました。
さて、しかし、Spark
が、私は次のエラーを取得していますようakka
は、影akka
で何とかアップ混入-providedようだ:
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設定を導入しても幸運です。適切な解決策は、構成キーをプログラムで「シェード」することです。 'sbt-assembly'はまだそのような機能を提供していないようです。おそらくそれはsbtを介して自分自身を行うことが可能です。 – juanmirocks