【问题标题】:Trying to deserialize a serialized ActorRef without an ActorSystem in scope - Spark/Akka/Scala试图反序列化一个没有 ActorSystem 范围内的序列化 ActorRef - Spark/Akka/Scala
【发布时间】:2016-07-18 11:36:06
【问题描述】:

编辑:在确认执行 forEach 后,与序列化/反序列化 Akka Actor 相关的异常仍然存在。 我正在学习 Akka,遇到了这个序列化问题,我对 Akka 很陌生,发现很难弄清楚如何最好地解决问题。

我有一个创建actorSystem 和actor 的类,该类调用另一个类中的方法,我想在另一个类中使用我的actor。到目前为止,我已经尝试过:

Class a:
-create actor
-classB.methodX(actor)

Class b:
-methodX(actorRef)
--actorRef! message

目前来自 B 类的消息没有被发送,而 A 类的消息发送,这让我觉得我要么需要用我传入的 ActorRef 实例化一个新的 Actor,要么,这是完全错误的。

我了解系统需要存在于所有节点上,但我不确定如何执行此操作。

编辑:代码片段:

ClassA:
  private val system = ActorSystem("System")
  private val metricActor= system.actorOf(Props(new MetricActor("metrics")), name = "metrics")

metricActor ! message works fine

writeFiles(metricActor) //writeFiles is in another class


writeFiles(actor: ActorRef) {
  f.forEach(v => {
  actor ! message // this doesn't seem to work
})
}

已编辑以提供更多代码。

B 类的完整示例

def writeFiles(bucket: String, filesToWrite: RDD[(String, String)], actor:ActorRef): Unit =
filesToWrite.foreachPartition(f => {
  f.foreach(v => {
    try {
      //actor  ! ProcessSingleItem(MetricItem("File Created"))
      logger.debug(s"Writing file:")
      writeFile()
    }
    catch {
      case e: Exception =>
        //actor ! ProcessSingleItem(CloudWatchMetricItem("File create failure")) 
        logger.error("Error creating file", e)
    }
  })
})

【问题讨论】:

  • Akka 演员只是隐藏起来的更大机器的一小部分。演员系统更像是汽车的引擎,你的演员可以说是油门等。如果整辆车都不见了,你认为只有油门就能让你动起来吗?
  • @SarveshKumarSingh 你有什么建议可以解决我目前的困境?每个节点都应该有汽车吗?这似乎很极端。节点是否应该具有向脚发送消息告诉 ti 按下加速器的能力?
  • 简短回答 -> 无论节点需要像汽车一样运行,都需要具有汽车的功能。只需设计您的解决方案,以便只有汽车类型节点需要表现得像汽车。其他节点可以保持轻量级。
  • @SarveshKumarSingh - 感谢您抽出宝贵时间发表评论,但这并没有真正的帮助。
  • 是的。我当然知道这不会有太大帮助。只是没有演员系统,演员就无法运作。因此,您只需要在设计时考虑到这一点。

标签: scala apache-spark akka


【解决方案1】:

您所描述的应该有效。您没有粘贴完整的(但最少的!)代码示例,所以我不能说问题出在哪里(可能是您的 foreach 逻辑中的某些内容;我们甚至不知道 f 是什么),但这是绝对有效的。尝试以此为基础。

object Test extends App {

  class MetricActor extends Actor {
    def receive = {
      case a: String => println(a)
    }
  }

  private val system = ActorSystem("System")
  private val metricActor= system.actorOf(Props(new MetricActor()), name = "metrics")

  OtherClass.writeFiles(metricActor) // prints "foo"
}

// this is in other file:
object OtherClass {
  def writeFiles(actor: ActorRef) {
    actor ! "foo"
  }
}

编辑:在 cmets 中讨论后发现有问题的部分与 Akka 无关(try 块甚至没有执行),但我将把它留在这里以防它对某人有所帮助。

【讨论】:

  • 嘿,感谢您抽出宝贵的时间来回答,我已经设法让一个例子(就像你写的那样)工作正常。我在 sn-p 中添加了更多内容,因为我认为您对 foreach 的权利,您介意看一下吗?非常感谢。
  • 嗯,我没看到。无论如何,请提供一个完整但最小的示例,它仍然会导致您出现问题(即剥离任何业务逻辑等,但保留类型、方法、类以及重现错误所需的任何内容)。完整是指它可以立即复制到 REPL/IDE 并运行而不会丢失依赖项等。即使我无法帮助您,这也会增加您获得好答案的机会。
  • 谢谢 slouc,现在应该在那里,我正在去除它的绒毛。调用类创建系统,一个actor,然后actor作为actorRef参数传入
  • 好的,现在我看到了,但请提供其余代码。 MetricActor 是什么样的?正如您从我的示例中看到的那样,问题绝对不在于其他类中没有演员系统。您确定 try 块中的代码甚至可以执行吗?也许 filesToWrite 是空的或什么的。
  • 对不起,还没有用火花的akka​​,其他人将不得不从这里拿走。至少我们从最初的问题取得了一些进展:)
猜你喜欢
  • 2016-02-19
  • 2019-08-15
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多