Flink Kafka-自定义类数据始终为null

时间:2018-07-02 15:41:06

标签: json serialization apache-kafka deserialization apache-flink

自定义类

人员

class Person
{
  private Integer id;
  private String name; 
 //getters and setters
}

Kafka Flink连接器

TypeInformation<Person> info = TypeInformation.of(Person.class);
TypeInformationSerializationSchema schema = new TypeInformationSerializationSchema(info, new ExecutionConfig());
DataStream<Person> input = env.addSource( new FlinkKafkaConsumer08<>("persons", schema , getKafkaProperties()));

现在,如果我发送以下json

{ "id" : 1, "name": Synd }

通过Kafka Console Producer,flink代码引发空指针异常 但是,如果我使用SimpleStringSchema而不是之前定义的CustomSchema,则将打印流。

上述设置有什么问题

2 个答案:

答案 0 :(得分:1)

TypeInformationSerializationSchema是一种反序列化模式,它使用Flink的序列化堆栈,因此也使用其序列化器。因此,在使用此SerializationSchema时,Flink希望数据已经使用Flink的Person类型的序列化器进行了序列化。

鉴于Person类的摘录,Flink很可能会使用其PojoTypeSerializer。此序列化程序无法理解提供JSON输入数据。

如果要使用JSON作为输入格式,则必须定义自己的DeserializationSchema,可以将JSON解析为Person

答案 1 :(得分:0)

回答相同问题的人

自定义序列化器

class PersonSchema implements DeserializationSchema<Person>{

    private ObjectMapper mapper = new ObjectMapper(); //com.fasterxml.jackson.databind.ObjectMapper;

    @Override
    public Person deserialize(byte[] bytes) throws IOException {
        return mapper.readValue( bytes, Person.class );
    }

    @Override
    public boolean isEndOfStream(Person person) {
        return false;
    }

    @Override
    public TypeInformation<Person> getProducedType() {
        return TypeInformation.of(new TypeHint<Person>(){});
    }
}

使用架构

DataStream<Person> input = env.addSource( new FlinkKafkaConsumer08<>("persons", new PersonSchema() , getKafkaProperties()));