#kotlin #apache-beam
Вопрос:
Короче говоря, я разработал конвейер с использованием apache beam поток данных на Java, и все работало так, как ожидалось. Пару недель назад я начал конвертировать свой java-код в kotlin, и именно тогда я начал видеть эту проблему.
Пример кода:
private val mapper = ObjectMapper().registerKotlinModule()
// read json file
val lines = pipeline.apply("Reading Input Data ", TextIO.read().from(options.inputFile))
// parse json
val exchangeObject = lines.apply("Convert Data to ExchangeObject model data", ParseJsons.of(ExchangeObject::class.java).withMapper(objectMapper)).setCoder(SerializableCoder.of(ExchangeObject::class.java))
Когда код пытается проанализировать Json, происходит сбой кода с:
Caused by: java.io.NotSerializableException: com.fasterxml.jackson.module.kotlin.ReflectionCache
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185)
at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1553)
at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
Кто-нибудь видел это раньше?
Ответ №1:
Похоже, это проблема с https://github.com/FasterXML/jackson-module-kotlin/issues/245.
Это связано с Apache Beam по одной причине: лямбды сериализуются, поэтому их можно запускать в распределенной системе. Рекомендация состоит в том, чтобы сделать его временным, а затем воссоздать его заново. Расширение Джексона луча имеет ParseJsons
преобразование, которое не соответствует этой практике.