Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
试图在scope-Spark/Akka/Scala中没有ActorSystem的情况下反序列化序列化的ActorRef_Scala_Apache Spark_Akka - Fatal编程技术网

试图在scope-Spark/Akka/Scala中没有ActorSystem的情况下反序列化序列化的ActorRef

试图在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!

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

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

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一起使用,其他人将不得不从这里获取它。至少我们在最初的问题上取得了一些进展:)