バックグラウンド
Flink が Kafka データを消費した後、後続のデータ処理を容易にするためにデータを POJO オブジェクトに変換することがよくありますが、各 POJO タイプは異なるため、毎回新しい逆シリアル化クラスを開発する必要があります。インフレーション逆シリアル化クラス ソリューションを実装しますか?
別のシナリオでは、flink が複数の Kafka トピックを同時にサブスクライブする場合、トピックに応じて異なる論理処理を行う必要があります。topic_A からソースされたデータの場合は、pojo のプロパティを 1 に設定し、topic_B からソースされたデータの場合は、pojo のプロパティを 1 に設定します。 、POJOのプロパティを2に設定します。これに対処するにはどうすればよいですか?
方法
実際、上記の 2 つの問題は、KafkaDeserializationSchema インターフェイスを実装することで解決できます。
1、通用型反序列化
/**
* @desc 自定义实现kafka的消息反序列化
* @throws
*/
public class CustomKafkaDeserializationSchema<T> implements KafkaDeserializationSchema<T> {
@Override
public boolean isEndOfStream(T nextElement) {
return false;
}
@Override
public T deserialize(ConsumerRecord<byte[], byte[]> record) throws Exception {
TypeReference<T> MAP_TYPE_REFERENCE =new TypeReference<T>(){};
T bTrack = JSON.parseObject(record.value(),MAP_TYPE_REFERENCE.getType());
return bTrack;
}
@Override
public TypeInformation<T> getProducedType() {
return TypeInformation.of(new TypeHint<T>() {
@Override
public TypeInformation<T> getTypeInfo() {
return super.getTypeInfo();
}
});
}
}
2. カスタムシリアル化
// kafka数据源
DataStreamSource<POJO> stream = env.addSource(
new FlinkKafkaConsumer<POJO>(topics, new CustomKafkaDeserializationSchema<POJO>(), PropertyFileUtils.readProFile("kafka.properties"))
.setCommitOffsetsOnCheckpoints(true)
.setStartFromLatest());
3. Kafka 関連の情報を取得する必要がある場合は、次の図のように読み取ることができます。