我已经编写了每天将数据推送到kafka主题的代码,但是我不确定该代码是否能够解决问题。我的职责是从包含1天数据(每天早上刷新)的实时表格中推送完整数据。
我的代码将查询“从mytable中选择*”,并将其逐一推送到kafka主题,然后再推送,我需要验证/更改每一行并推送到主题。
下面是我的生产者发送代码。
Properties configProperties = new Properties();
configProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, sBOOTSTRAP_SERVERS_CONFIG);
configProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.StringSerializer");
configProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.StringSerializer");
configProperties.put("acks", "all");
configProperties.put("retries", 0);
configProperties.put("batch.size", 15000);
configProperties.put("linger.ms", 1);
configProperties.put("buffer.memory", 30000000);
@SuppressWarnings("resource")
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(configProperties);
System.out.println("Starting Kafka producer job " + new Date());
producer.send(new ProducerRecord<String, String>(eventName, jsonRec.toString()), new Callback() {
public void onCompletion(RecordMetadata metadata, Exception e) {
if (e != null) {
e.printStackTrace();
}
}
});
现在,我不确定在失败的情况下如何将数据再次推回主题。由于我已经从表中选择了所有记录,因此很少有失败,而且我不知道全部。
以下是我要解决的问题
如何仅处理那些未推送的记录,以避免重复记录被推送(避免冗余)。
如何验证推送的记录与表中的完全相同。我的意思是数据完整性。例如数据的大小和记录的数量。
答案 0 :(得分:0)
您可以使用configProperties.put("enable.idempotence", true);
-它会尝试重试失败的消息,但请确保在kafka中保存的每个记录中只有一个。请注意,这意味着retries>0
acks=all
和max.in.flight.requests.per.connection
> = 0。有关详细信息,请检查https://kafka.apache.org/documentation/。
对于第二个问题-如果您要保存所有记录或不保存所有记录,则必须使用kafka事务处理,这会带来更多问题,我建议阅读https://www.confluent.io/blog/transactions-apache-kafka/