使用KafkaStream从主题读取Avro消息,将其转换为字符串/ json并存储在AWS S3存储桶中

时间:2020-07-16 09:14:39

标签: spring amazon-s3 avro apache-kafka-streams

我正在研究一个用例,其中我必须从afro格式的流中读取来自kafka主题的消息,并将其转换为字符串,然后将其存储到AWS S3存储桶中。

@Configuration
public class MessagePromotion {
@Autowired
private AmazonS3 s3client;
 
@Value("${aws.s3.bucket}")
private String awsS3Bucket;

@Autowired

@Bean
public KStream<String, testEvent> kstreamPromotionUppercase(StreamsBuilder builder) {
    
    
    KStream<String, testEvent> sourceStream = builder.stream("test-topic");
    
    

    //sourceStream.print(Printed.<String, testEvent>toSysOut().withLabel("Original Stream"));
    
    sourceStream.mapValues(testEvent -> new ObjectMapper().writeValueAsString(testEvent));
    

    


    s3client.putObject(awsS3Bucket, "test3", sourceStream.toString() );
    

    return sourceStream;
}}

我能够在Avro中读取消息,但无法将其转换为字符串/ json。我在这里做错了

 sourceStream.mapValues(testEvent -> new ObjectMapper().writeValueAsString(testEvent));

1 个答案:

答案 0 :(得分:0)

sourceStream.mapValues()的结果是一个KStream,它是数据流的逻辑抽象-它不是像Java MapList这样的真正“容器”等等,因此,调用KStream.toString()类似于调用Object.toString() ...实际上并没有任何作用。

如果要遍历所有消息,请致电foreach()

KStream<String, String> converted = sourceStream.mapValues(...);
converted.foreach((k, v) -> s3client.putObject(awsS3Bucket, "test3", v));

不过,还请注意,StreamsBuilder仅声明一个数据流(即,它建立了一个计划,但不执行任何操作)。要真正开始计算,您需要创建KafakStreams客户,将TopologyStreamBuilder#build()客户的start()传入。

我强烈建议您检查文档,阅读介绍和快速入门,以更好地了解Kafka Streams的工作原理:https://kafka.apache.org/documentation/streams/