2

我想在我的风暴拓扑中为 Scala 集合注册序列化程序。为此,我正在使用 twitter chill KryoSerializer。

我正在做的是
1. 创建了一个实现 IKryoDecorator 的装饰器。在装饰方法中,我调用 KryoSerializer.registerAll(k),其中 k 是 Kyro 实例
2。在拓扑配置对象中,我调用 registerDecorator 方法。

import com.twitter.chill.KryoSerializer
import com.esotericsoftware.kryo.Kryo
import backtype.storm.serialization.IKryoDecorator

class KryoDecorator extends IKryoDecorator {
  def decorate(k: Kryo) {
    KryoSerializer.registerAll(k)
  }
}

接着

stormConfig.registerDecorator(classOf[ReflexKryoDecorator])

仍然当我运行拓扑时,我得到异常说明“类未注册:scala.collection.immutable.Map$Map3”

Storm 版本 0.8.2 Chill 版本 0.2.3

4

1 回答 1

0

你用的是什么版本,不清楚。

这是一个错误,因为 scala 特殊情况下是小地图,并且因为 Storm 默认需要注册,最后是因为不知何故,默认的地图序列化程序没有被拾取:

https://github.com/twitter/chill/blob/develop/chill-scala/src/main/scala/com/twitter/chill/KryoSerializer.scala#L108

我添加了一个问题: https ://github.com/twitter/chill/issues/60

要解决此问题,请像我们在此处一样将注册设置为可选: https ://github.com/twitter/chill/blob/develop/chill-scala/src/main/scala/com/twitter/chill/KryoBijection.scala# L38

于 2013-05-29T16:50:35.543 回答