Ошибка сериализации при запуске приложения Flink

У меня есть приложение Flink, которое постоянно выдает эту ошибку.

com.org.ads.audience.traffic.MyClass@6eaa21d8 is not serializable. The object probably contains or references non serializable fields.
        org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:140)
        org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:115)
        org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.clean(StreamExecutionEnvironment.java:1558)
        org.apache.flink.streaming.api.datastream.DataStream.clean(DataStream.java:185)
        org.apache.flink.streaming.api.datastream.DataStream.flatMap(DataStream.java:611

Очень сложно отследить, почему этот класс не сериализуем. Я убедился, что MyClass и все другие классы, на которые он ссылается, Serializable и имеют конструкторы по умолчанию. Как я могу отладить это дальше? Я попытался добавить -Dsun.io.serialization.extendedDebugInfo=true в командную строку, но, похоже, он не предоставляет мне дополнительной информации. Я работаю в режиме кластера пряжи.


person frodo    schedule 24.09.2019    source источник
comment
У меня есть вопросы ... В каких функциях используется Myclass? Вы пытались создать экземпляр объекта myclass как временный?   -  person Antonio Miranda    schedule 25.09.2019
comment
Привет - MyClass реализует FlatMapFunction. И да! Мне удалось обойти эту ошибку, сделав объект временным :) Интересно, влияет ли это на производительность / правильно ли это делать?   -  person frodo    schedule 25.09.2019
comment
еще одна вещь - даже несмотря на то, что некоторые переменные экземпляра MyClass отмечены как временные, мне пришлось добавить объяснение MyClass implements Serializable, чтобы мое приложение Flink не выходило из строя. Это кажется странным.   -  person frodo    schedule 25.09.2019


Ответы (1)


Один из моих классов использовал JDBC BasicDataSource, который содержит несериализуемые элементы. Мне пришлось отметить это как transient, чтобы иметь возможность сериализовать.

person frodo    schedule 26.09.2019
comment
Почему вы используете JDBC BasicDataSource? Ваши данные должны поступать из потока Flink, а не из внешнего источника данных. - person Guillaume Vauvert; 27.09.2019
comment
Я читаю события из Kafka, и мне нужно объединить их с некоторыми (в основном статическими) данными в mysql. Я делаю это в FlatMap функции. - person frodo; 27.09.2019
comment
что-то вроде этого ci.apache .org / projects / flink / flink-docs-release-1.9 / dev / stream /, за исключением того, что в настоящее время я не использую async io. - person frodo; 27.09.2019