Flink接收Kafka中的Avro序列化消息

在Flink官網中可以看到flink接收kafka數據的簡單示例程序

Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
// only required for Kafka 0.8
properties.setProperty("zookeeper.connect", "localhost:2181");
properties.setProperty("group.id", "test");
DataStream<String> stream = env
	.addSource(new FlinkKafkaConsumer08<>("topic", new SimpleStringSchema(), properties));

 這裏傳給FlinkKafkaConsumer08構造方法的第二個參數new SimpleStringSchema()即指定了從kafka獲取消息後反序列化的方式爲字符串序列化方式,當我們的kafka中消息是採用Avro實現序列化後,我們反序列化也要指定爲採用Avro的方式,這裏flink提供了一個叫做AvroDeserializationSchema的類,它可以實現Avro反序列化,實現方式示例如下:

首先創建這個Avro反序列化對象,通過forSpecific(User.class)方法指定需要序列化的實例類class爲User.class(我的數據對象是User類實例)

AvroDeserializationSchema<User> UserSchema = AvroDeserializationSchema.forSpecific(User.class);

其中User類的實例就是我在kafka中傳輸的數據,這樣添加source時就可以使用這個序列化對象了

DataStream<String> stream = env
    .addSource(new FlinkKafkaConsumer08<>("topic", UserSchema, properties));

另外,Flink官網上說這個Avro序列化類不期望使用嵌套的數據結構(嵌套的schema),原話:This deserialization schema expects that the serialized records DO NOT contain embedded schema.

但是我的User類裏還嵌套了個類,使用起來也能正常解析,沒發現問題

 

發佈了5 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章