试图在scope-Spark/Akka/Scala中没有ActorSystem的情况下反序列化序列化的ActorRef
编辑:确认forEach正在执行后,与序列化/反序列化Akka Actor相关的异常仍然存在。 我正在学习Akka,遇到了这个系列化问题,我对Akka很陌生,发现很难找到最好的解决方案 我有一个创建actorSystem和actor的类,该类调用另一个类中的方法,我想在另一个类中使用我的actor。到目前为止,我已经尝试:试图在scope-Spark/Akka/Scala中没有ActorSystem的情况下反序列化序列化的ActorRef,scala,apache-spark,akka,Scala,Apache Spark,Akka,编辑:确认forEach正在执行后,与序列化/反序列化Akka Actor相关的异常仍然存在。 我正在学习Akka,遇到了这个系列化问题,我对Akka很陌生,发现很难找到最好的解决方案 我有一个创建actorSystem和actor的类,该类调用另一个类中的方法,我想在另一个类中使用我的actor。到目前为止,我已经尝试: Class a: -create actor -classB.methodX(actor) Class b: -methodX(actorRef) --actorRef!
Class a:
-create actor
-classB.methodX(actor)
Class b:
-methodX(actorRef)
--actorRef! message
目前,b类的消息没有被发送,而A类的消息被发送,这让我觉得我要么需要用我正在传递的ActorRef实例化一个新的参与者,要么,这是完全错误的
我知道系统需要出现在所有节点上,但我不确定如何做到这一点
编辑:代码段:
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)
}
})
})
你所描述的应该有用。您没有粘贴完整的(但最小的!)代码示例,因此我无法说出问题出在哪里(可能是您的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"
}
}
编辑:在评论中讨论后发现问题部分与Akka无关(try block甚至没有执行),但我将把它留在这里,以防它对某人有所帮助。Akka演员只是隐藏起来的更大机器的一小部分。演员系统更像汽车的引擎,你的演员可以说像加速器等。你认为如果整辆车都不见了,光靠加速器就能让你动起来吗?@SarveshKumarSingh你有什么建议来解决我目前的困境?每个节点都应该有一辆车吗?这似乎有些极端。节点是否应该能够向脚发送消息,告诉ti按下油门?简短回答->任何节点需要像汽车一样工作,都需要具备汽车的功能。只需设计您的解决方案,以便只有汽车类型节点的行为需要像汽车一样。其他节点可以保持轻量级。@SarveshKumarSingh-感谢您花时间发表评论,但这并没有真正的帮助。是的。我当然知道这不会有多大帮助。只是演员没有演员系统就不能正常工作。所以你必须在设计时牢记这一点。嘿,谢谢你花时间回答,我已经成功地得到了一个例子(就像你写的那样)运行良好。我已经在片段中添加了更多内容,因为我认为您对foreach的理解是正确的,您介意看一看吗?非常感谢。嗯,我没看到。无论如何,请提供一个完整但最小的示例,它仍然会给您带来问题(即,去掉任何业务逻辑等,但保留类型、方法、类,以及重现错误所需的任何内容)。我所说的完整是指它可以立即复制到REPL/IDE并在不丢失依赖项的情况下运行。即使我不能帮助您,这也会增加您获得好答案的机会。谢谢slouc,现在应该在那里了,我正在清除它的绒毛。调用类创建系统,一个actor,然后作为actorRef参数传入,现在我看到了,但是请提供其余的代码。
MetricActor
长什么样?问题肯定不是在另一个类中没有actor系统,正如我的示例所示。您确定try块中的代码确实执行了吗?也许FileToWrite是空的或是别的什么。对不起,没有将akka与spark一起使用,其他人将不得不从这里获取它。至少我们在最初的问题上取得了一些进展:)