Scala 阿克卡:“;试图反序列化序列化作用域中没有ActorSystem的序列化ActorRef;错误

Scala 阿克卡:“;试图反序列化序列化作用域中没有ActorSystem的序列化ActorRef;错误,scala,apache-spark,akka,Scala,Apache Spark,Akka,我以以下方式集成了Akka actor和Spark的使用:当任务分布在Spark节点之间时,在处理该任务的同时,每个节点还通过使用Akka actor定期将度量数据发送到位于网络其他位置的不同收集器进程(通过akka remote连接到远程进程) 在独立模式下使用时,基于参与者的度量发送/接收功能工作正常,但在Spark任务中集成时,会引发以下错误: java.lang.IllegalStateException: Trying to deserialize a serialized Actor

我以以下方式集成了Akka actor和Spark的使用:当任务分布在Spark节点之间时,在处理该任务的同时,每个节点还通过使用Akka actor定期将度量数据发送到位于网络其他位置的不同收集器进程(通过akka remote连接到远程进程)

在独立模式下使用时,基于参与者的度量发送/接收功能工作正常,但在Spark任务中集成时,会引发以下错误:

java.lang.IllegalStateException: Trying to deserialize a serialized ActorRef without an ActorSystem in scope. Use 'akka.serialization.Serialization.currentSystem.withValue(system) { ... }'
at akka.actor.SerializedActorRef.readResolve(ActorRef.scala:407) ~[akka-actor_2.10-2.3.11.jar:na]
如果我理解正确,问题的根源是Spark节点无法对ActorRef进行反序列化,因为它没有进行反序列化所需的全部信息。我理解将ActorSystem放入作用域将解决此问题,但我不确定如何使用建议的
akka.serialization.serialization.currentSystem.withValue(系统){…}

Akka官方文档在几乎所有的主题上都非常好。不幸的是,关于序列化的章节可以在IMHO中改进


注意:有一个类似的SO问题,但公认的解决方案过于具体,因此在一般情况下并不真正有用。一个
ActorSystem
负责
ActorRef
对象涉及的所有功能

当你编写类似的程序时

actorRef ! message
实际上,您正在调用ActorSystem(而不是ActorRef)中的一系列工作,以将消息放入正确的邮箱,启动Actor以在线程池中运行receive方法,等等…从:

actor系统管理配置为按顺序使用的资源 运行它包含的演员。可能有数百万演员 在一个这样的系统中,毕竟咒语是将它们视为 数据量非常丰富,它们的开销只有大约300字节 每个实例。当然,消息的确切顺序是 应用程序无法控制在大型系统中处理的数据 作者

这就是为什么您的代码“独立”运行良好,但不是在Spark中。您的每个Spark节点都缺少ActorSystem机制,因此,即使您可以在节点中反序列化ActorRef,也不会有ActorSystem来处理节点函数中的


您可以在每个节点内建立ActorSystem,并使用(i)通过或(ii)向“主”ActorSystem中的ActorRef发送消息您提到的序列化方法,其中每个节点的actor系统将是您引用的示例中的
系统。

您有actor系统实例吗?@ViktorKlang是和否。当我在“独立”模式下使用我的actor库时(只有两个常规的Scala应用程序使用此库相互对话)一切正常,因此显然存在ActorSystem实例。但是,正如错误消息所示,Spark节点中没有使用Actor发送度量消息的ActorSystem实例。我不清楚如何使用建议的
.serialization.serialization.currentSystem.withValue(system){…}
将该实例提供给Spark节点