Flink は Kafka のトピック、パーティション、オフセット情報をどのように取得しますか

バックグラウンド

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 関連の情報を取得する必要がある場合は、次の図のように読み取ることができます。

 

おすすめ

転載: blog.csdn.net/lzzyok/article/details/127241754