【发布时间】: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