我开始使用Spark Streaming处理我得到的实时数据Feed。我的场景是我有一个Akka演员接收器使用"使用ActorHelper"然后我让我的Spark工作做一些映射和转换然后我想把结果发送给另一个演员。
我的问题是最后一部分。当试图发送给另一个演员时,Spark正在提出异常:
15/02/20 16:43:16 WARN TaskSetManager:阶段2.0中的丢失任务0.0(TID 2,localhost):java.lang.IllegalStateException:尝试在范围内没有ActorSystem的情况下反序列化序列化的ActorRef。使用' akka.serialization.Serialization.currentSystem.withValue(系统){...}'
我创建这个最后一个演员的方式如下:
val actorSystem = SparkEnv.get.actorSystem
val lastActor = actorSystem.actorOf(MyLastActor.props(someParam), "MyLastActor")
然后像这样使用它:
result.foreachRDD(rdd => rdd.foreachPartition(lastActor ! _))
我不知道在何处或如何进行建议"使用' akka.serialization.Serialization.currentSystem.withValue(系统){...}'"。我是否需要通过配置设置任何特殊内容?或者以不同的方式创建我的演员?
答案 0 :(得分:1)
请查看以下示例以访问Spark域之外的actor。
/ * *以下是使用actorStream将自定义actor插入接收器 * *需要注意的重点: *由于Actor可能存在于spark框架之外,因此用户有责任 *确保类型安全,即接收的数据类型和InputDstream *应该是一样的。 * *例如:参数化了actorStream和SampleActorReceiver *为相同类型,以确保类型安全。 * /
val lines = ssc.actorStream[String](
Props(new SampleActorReceiver[String]("akka.tcp://test@%s:%s/user/FeederActor".format(
host, port.toInt))), "SampleReceiver")
答案 1 :(得分:1)
我发现如果我在发送给演员之前收集它就会像魅力一样:
result.foreachRDD(rdd => rdd.collect().foreach(producer ! _))