Flink中ActorSystem的序列化错误

时间:2018-08-02 08:49:26

标签: scala serialization akka apache-flink

我正在创建Flink作业,在我的处理步骤之一中,我需要写DynamoDB。我正在使用Alpakka的DynamoDB客户端,该客户端需要在初始化期间将actor系统置于上下文中。创建此actor系统时,出现序列化错误(我已经将actor系统标记为瞬态):

Exception when initializing DynamoDB interface akka.seriali
zation.Serializer is not assignable from class akka.remote.serialization.MiscMes
sageSerializerjava.lang.ClassCastException: interface akka.serialization.Seriali
zer is not assignable from class akka.remote.serialization.MiscMessageSerializer
        at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(Refle
ctiveDynamicAccess.scala:24)
        at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(Refle
ctiveDynamicAccess.scala:21)
        at scala.util.Try$.apply(Try.scala:192)
        at akka.actor.ReflectiveDynamicAccess.getClassFor(ReflectiveDynamicAcces
s.scala:21)
        at akka.actor.ReflectiveDynamicAccess.createInstanceFor(ReflectiveDynami
cAccess.scala:39)
        at akka.serialization.Serialization.serializerOf(Serialization.scala:375
)
        at akka.serialization.Serialization$$anonfun$6.apply(Serialization.scala
:401)
        at akka.serialization.Serialization$$anonfun$6.apply(Serialization.scala
:401)
        at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(Trav
ersableLike.scala:683)
        at scala.collection.immutable.HashMap$HashMap1.foreach(HashMap.scala:221
)
        at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:
428)
        at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala
:682)
        at akka.serialization.Serialization.<init>(Serialization.scala:401)
        at akka.serialization.SerializationExtension$.createExtension(Serializat
ionExtension.scala:16)
        at akka.serialization.SerializationExtension$.createExtension(Serializat
ionExtension.scala:13)
        at akka.actor.ActorSystemImpl.registerExtension(ActorSystem.scala:913)
        at akka.actor.ActorSystemImpl$$anonfun$loadExtensions$1$1.apply(ActorSys
tem.scala:946)
        at akka.actor.ActorSystemImpl$$anonfun$loadExtensions$1$1.apply(ActorSys
tem.scala:944)
        at scala.collection.Iterator$class.foreach(Iterator.scala:891)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
        at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
        at akka.actor.ActorSystemImpl.loadExtensions$1(ActorSystem.scala:944)
        at akka.actor.ActorSystemImpl.loadExtensions(ActorSystem.scala:961)
        at akka.actor.ActorSystemImpl.liftedTree2$1(ActorSystem.scala:833)
        at akka.actor.ActorSystemImpl._start$lzycompute(ActorSystem.scala:823)
        at akka.actor.ActorSystemImpl._start(ActorSystem.scala:823)
        at akka.actor.ActorSystemImpl.start(ActorSystem.scala:842)
        at akka.actor.ActorSystem$.apply(ActorSystem.scala:246)
        at akka.actor.ActorSystem$.apply(ActorSystem.scala:289)
        at akka.actor.ActorSystem$.apply(ActorSystem.scala:234)
object DynamoDBHandler {

 val instance = new DynamoDBHandler()
 instance.init()

 def getInstance() = instance
}

class DynamoDBHandler {



 @transient
  var client:DynamoClient = _

 @transient
 var settings: DynamoSettings = _

 def init() = {

   try {
      @transient
      implicit val system == ActorSystem("DynamoDB_EventStreamProcessor_Actor_System")

  @transient
  implicit val materializer = ActorMaterializer()

    settings = new DynamoSettings(us-east-1, s"dynamodb.us-east-1.amazonaws.com", 443, 16, new DefaultAWSCredentialsProviderChain())
  }
  client = DynamoClient(settings)
} catch {
  case ex: Exception => LOGGER.error("Exception when initializing DynamoDB " + ex.getMessage + ExceptionUtils.getFullStackTrace(ex))
}

LOGGER.info("DynamoDB init complete")
  }
}

我在运算符中使用此处理程序的方式如下:

 class ProcessWindowFunc  extends ProcessWindowFunction[Record[util.Map[String, AnyRef]], String, String, TimeWindow] {

  @throws[Exception]
  override def  open(parameters: Configuration) = {
    // Let's make sure DynamoDBHandler is initialized
    DynamoDBHandler.getInstance()
  }

    @throws[Exception]
    override def process(key: String, context: ProcessWindowFunction[Record[util.Map[String, AnyRef]], String, String, TimeWindow]#Context, elements: lang.Iterable[Record[util.Map[String, AnyRef]]], out: Collector[String]): Unit = {

    DynamoDBHandler.getInstance().callSomeUpdateMethod()
    }
}

我很高兴看到任何有关为什么出现Serializer错误以及如何解决它的指示。

0 个答案:

没有答案