Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Scala+;SBT-如何为着色Akka库配置reference.conf TL;博士_Apache Spark_Akka_Cloudera Cdh_Sbt Assembly_Shading - Fatal编程技术网

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
文件中定义了它的默认配置,该文件应该位于应用程序的类路径上。由于in
sbt组件的着色功能,着色的
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)