我正面临与kafka火花流相关的问题,我的用例如下:
现在,问题是在流式传输过程中我们正在丢失一些消息,即所有传入的消息都不会写入协调或非协调的主题。 例如,如果应用程序在一个批处理中收到30条消息,那么有时它会将所有消息写入输出主题(这是预期的行为),但有时它只写入27条消息(3条消息丢失,此数字可能会改变)。
版本如下:
Kafka主题配置如下:
以下是我们用于kafka的属性:
val props = new Properties()
props.put("metadata.broker.list", properties.getProperty("metadataBrokerList"))
props.put("auto.offset.reset", properties.getProperty("autoOffsetReset"))
props.put("group.id", properties.getProperty("group.id"))
props.put("serializer.class", "kafka.serializer.StringEncoder")
props.put("outTopicHarmonized", properties.getProperty("outletKafkaTopicHarmonized"))
props.put("outTopicUnharmonized", properties.getProperty("outletKafkaTopicUnharmonized"))
props.put("acks", "all");
props.put("retries", "5");
props.put("request.required.acks", "-1")
以下是我们将处理过的消息写入kafka的代码: val schemaRdd2 = finalHarmonizedDF.toJSON
schemaRdd2.foreachPartition { partition =>
val producerConfig = new ProducerConfig(props)
val producer = new Producer[String, String](producerConfig)
partition.foreach { row =>
if (debug) println(row.mkString)
val keyedMessage = new KeyedMessage[String, String](props.getProperty("outTopicHarmonized"),
null, row.toString())
producer.send(keyedMessage)
}
//hack, should be done with the flush
Thread.sleep(1000)
producer.close()
}
我们明确添加了sleep(1000)用于测试目的。 但这也没有解决问题:(
任何建议都将不胜感激。
答案 0 :(得分:0)
尝试将.xlsm
参数(初始化vbaProject.bin
时)调整为大于每个rdd处理时间的数值。这解决了我的问题。
答案 1 :(得分:0)
由于您不想丢失任何消息,因此您可能希望选择“恰好一次”传递语义,该语义不会造成数据丢失。为了配置准确的一次传送语义,您必须使用acks ='all'。
根据此资源[1],必须将acks ='all'属性与min.insync.replicas属性结合使用。
[1] https://www.linkedin.com/pulse/kafka-producer-delivery-semantics-sylvester-daniel/