自定义类
人员
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,则将打印流。
上述设置有什么问题
答案 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()));