Как сериализовать поле непримитивного типа (ваш собственный класс) в топологии Storm?
При запуске моего проекта Storm выдается следующее исключение:
java.lang.RuntimeException: java.io.NotSerializableException: com.youtab.dataType.id.GUID
at backtype.storm.serialization.DefaultSerializationDelegate.serialize(DefaultSerializationDelegate.java:43)
at backtype.storm.utils.Utils.serialize(Utils.java:85)
at backtype.storm.topology.TopologyBuilder.createTopology(TopologyBuilder.java:111)
Как часть моего проекта Storm, я пытаюсь передать Событие типа объекта от первого носика до первого болта, а затем использовать его. К сожалению, после реализации всех необходимых изменений и фиксаций в моей переменной конфигурации - как описано в документации по Storm, по-прежнему не удается десериализовать одно частное поле типа "GUID", которое является одним полем из моего собственного частного класса Event.
Я создал следующий класс сериализации:
public class GUIDSerializer extends Serializer<GUID> {
@Override
public void write(Kryo kryo, Output output, GUID guid) {
output.write(guid.toString().getBytes());
}
@Override
public GUID read(Kryo kryo, Input input, Class<GUID> aClass) {
return GUID.of(input.readString());
}
}
И я зарегистрировал сериализацию по мере необходимости:
Config conf = new Config();
conf.registerSerialization(GUID.class, GUIDSerializer.class);
2 ответа
Все классы, используемые в качестве типа данных для атрибутов / полей, должны реализовывать Java Serializable
интерфейс. В вашем случае это относится к вашему Event
класс, а также все используемые члены Event
лайк GUID
, Конечно, это применяется рекурсивно, т. Е. Если GUID
содержит пользовательские типы, которые должны реализовывать Serializable
, тоже.
Предоставление собственного сериализатора Kryo на самом деле не требуется. Storm может использовать сериализатор Java по умолчанию. Однако из соображений производительности настоятельно рекомендуется регистрировать пользовательские типы. В большинстве случаев достаточно просто зарегистрировать классы пользовательских типов через
conf.registerSerialization(MyUserType.class);
В твоем случае
conf.registerSerialization(Event.class);
conf.registerSerialization(GUID.class);
Регистрация класса позволяет Storm использовать более эффективный (общий) сериализатор Kryo вместо стандартного сериализатора Java.
Если этот обычный сериализатор Kryo все еще недостаточно эффективен, вы можете предоставить собственный сериализатор Kryo (как вы упомянули в своем вопросе). Тем не менее, класс должен по-прежнему реализовывать Java Serializable
интерфейс!
Я не знаю Serializer
класс, но, исходя из исключения, нужно сделать GUID
класс реализует интерфейс java.io.Serializable
лайк:
public class GUID implements Serializable {
//...
Если вы сомневаетесь, пожалуйста, оставьте свой текущий код для GUID
,