我正在创建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错误以及如何解决它的指示。