在运行Spark结构化流程序时,我观察到奇怪的行为。我正在使用S3存储桶进行元数据检查点。 kafka主题有310个分区。
当我第一次开始流作业时,每个批处理完成后,spark都会在checkpinting位置的偏移目录中创建一个名为batch_id的新文件。成功之后 几次重试完成,几次重试后发出警告,警告工作失败''WARN KafkaMicroBatchReader:66-Set(logs-2019-10-04-77,logs-2019-10-04-85,logs-2019-10-04-71 ,日志-2019-10-04-93,日志-2019-10-04-97,日志-2019-10-04-101,日志-2019-10-04-89,日志-2019-10-04-81 ,日志-2019-10-04-103,日志-2019-10-04-104,日志-2019-10-04-102,日志-2019-10-04-98,日志-2019-10-04-94 ,日志-2019-10-04-90,日志-2019-10-04-74,日志-2019-10-04-78,日志-2019-10-04-82,日志-2019-10-04-86 ,日志-2019-10-04-99,日志-2019-10-04-91,日志-2019-10-04-73,日志-2019-10-04-79,日志-2019-10-04-87 ,日志-2019-10-04-83,日志-2019-10-04-75,日志-2019-10-04-92,日志-2019-10-04-70,日志-2019-10-04-96 ,日志-2019-10-04-88,日志-2019-10-04-95,日志-2019-10-04-100,日志-2019-10-04-72,日志-2019-10-04-76 ,logs-2019-10-04-84,logs-2019-10-04-80)消失了,可能丢失了一些数据。 某些数据可能已经丢失,因为它们在Kafka中不再可用。要么 数据已被Kafka淘汰,或者该主题可能已被删除, 主题已处理。如果您希望流查询在这种情况下失败,请设置源 选项“ failOnDataLoss”设置为“ false”。”
这很奇怪,前一个批次的偏移文件包含所有310个分区的分区信息,但是当前批次仅读取所选的分区(请参阅上面的警告消息)。 我通过设置“ .option(” failOnDataLoss“,false)”重新运行了作业,但上面得到了相同的警告,而没有作业失败。可以观察到,spark正在为几个分区处理正确的偏移量,而对于其余的分区,它正在从起始offset(0)读取。 发生此错误时,spark-kafka没有连接问题(我们也检查过kafka日志)。
有人可以帮忙吗?我做错了什么还是错过了什么?
下面是读写流代码片段。
val kafkaDF = ss.readStream.format("kafka")
.option("kafka.bootstrap.servers", kafkaBrokers /*"localhost:9092"*/)
.option("subscribe", logs)
.option("fetchOffset.numRetries",5)
.option("maxOffsetsPerTrigger", 30000000)
.load()
val query = logDS
.writeStream
.foreachBatch {
(batchDS: Dataset[Row], batchId: Long) =>
batchDS.repartition(noofpartitions, batchDS.col("abc"), batchDS.col("xyz")).write.mode(SaveMode.Append).partitionBy("date", "abc", "xyz").format("parquet").saveAsTable(hiveTableName /*"default.logs"*/)
}
.trigger(Trigger.ProcessingTime(1800 + " seconds"))
.option("checkpointLocation", s3bucketpath)
.start()
谢谢。