Tôi có ứng dụng phát trực tuyến Spark được viết bằng Java và sử dụng Spark 2.1. Tôi đang sử dụng KafkaUtils.createDirectStream
để đọc tin nhắn từ Kafka. Tôi đang sử dụng bộ mã hóa/giải mã kryo cho tin nhắn kafka. Tôi đã chỉ định điều này trong thuộc tính Kafka-> key.deserializer, value.deserializer, key.serializer, value.deserializer
Khi Spark kéo các tin nhắn trong một lô vi mô, các thông báo được giải mã thành công bằng bộ giải mã kryo. Tuy nhiên tôi nhận thấy rằng thực thi Spark tạo ra một thể hiện mới của bộ giải mã kryo để giải mã từng thông điệp đọc từ kafka. Tôi đã kiểm tra điều này bằng cách đặt nhật ký bên trong bộ giải mã bộ giải mã
Điều này có vẻ lạ đối với tôi. Không nên cùng một bộ giải mã được sử dụng cho mỗi tin nhắn và mỗi lô?Tại sao luồng trực tiếp của Kafka tạo bộ giải mã mới cho mọi thư?
Mã nơi tôi đang đọc từ Kafka:
JavaInputDStream<ConsumerRecord<String, Class1>> consumerRecords = KafkaUtils.createDirectStream(
jssc,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.<String, Class1>Subscribe(topics, kafkaParams));
JavaPairDStream<String, Class1> converted = consumerRecords.mapToPair(consRecord -> {
return new Tuple2<String, Class1>(consRecord.key(), consRecord.value());
});
Nghiên cứu rất tốt! #impressed –
@Yuval: Tôi đang sử dụng Kafka 0.10.x. Spark sử dụng người dùng kafka đã lưu trong bộ nhớ cache (mỗi người thực thi), trong đó khóa bộ nhớ cache được xác định theo ID người tiêu dùng, ID chủ đề, ID phân vùng. Nó có ý nghĩa để có một bộ giải mã cho mỗi phân vùng kafka hoặc cách khác Spark sẽ giải mã các tin nhắn song song. Những gì tôi mong đợi là một bộ giải mã mới phải được tạo ra một lần cho mỗi phân vùng bên trong một người tiêu dùng lưu trữ và thats nó! Tôi không thấy vấn đề này dưới tải nhẹ nhưng chỉ khi tôi bơm 1000 tin nhắn mỗi giây. Có lẽ tôi đang chạy vào một chu kỳ "GC". Bạn có bất kỳ ý tưởng nào về cách bật tính năng ghi nhật ký trong lớp KafkaRDD không? – scorpio
@scorpio Kafka 0.10.x không yêu cầu bộ giải mã. Nó trả về 'ConsumerRecord' cơ bản, và bạn chọn phải làm gì với nó. Bạn đang tạo một thể hiện của một bộ giải mã bên trong một 'bản đồ' có lẽ? –