最近,我已经将我们的流媒体应用程序从spark-streaming 2.1转换为使用kafka-streaming new API(1.0)和kafka broker server 0.11.0.0
我已经实现了自己的Processor类,在处理方法中,我只是打印了消息内容。
我有一台3台机器的kafka集群,我挂钩的主题有300个分区。
我使用100个线程运行流式应用程序,在具有32 GB RAM和8个内核的计算机上运行。
我的问题是,在某些情况下,一旦到达kafka主题/分区,我就收到了消息,而在其他情况下,我在10-15分钟到达主题后收到了消息,Don&#tt知道为什么!
我使用以下命令行来跟踪流媒体应用的group.id的kafka主题的延迟。
./bin/kafka-run-class.sh kafka.admin.ConsumerGroupCommand --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --new-consumer --describe --group kf_streaming_gp_id
但不幸的是,它并不能始终如一地给出准确的结果,甚至根本没有给出结果,任何人都知道为什么?
流媒体应用程序是否遗漏了一些内容,以便一旦到达分区,我就能阅读这些消息? 任何消费者属性都可以解决这个问题。
我的kafka-streaming app结构如下:
Properties config = new Properties();
config.put(StreamsConfig.APPLICATION_ID_CONFIG, "kf_streaming_gp_id");
config.put(StreamsConfig.CLIENT_ID_CONFIG, "kf_streaming_gp_id");
config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka1:9092,kafka2:9092,kafka3:9092");
config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, DocumentSerde.class);
config.put(StreamsConfig.DEFAULT_TIMESTAMP_EXTRACTOR_CLASS_CONFIG, CustomTimeExtractor.class);
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
config.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, 100);
KStream<String, Document> topicStreams = builder.stream(sourceTopic);
topicStreams.process(() -> new DocumentProcessor(appName, environment, dimensions, vector, sinkTopic));
KafkaStreams streams = new KafkaStreams(builder.build(), config);
streams.start();
答案 0 :(得分:0)
我弄清楚我的问题是什么问题。
事实证明,在执行高CPU密集型工作时会遇到线程问题,导致其他线程停止消耗消息,这就是我看到这样的突发事件的原因,当我停止这个cpu密集逻辑时,一切都超级快,并且一旦他们到达kafka主题,消息就会进入流媒体作业。