运行一段时间后,Spark结构化流与kafka抛出错误

时间:2019-10-07 15:33:56

标签: scala apache-spark apache-kafka spark-streaming spark-streaming-kafka

在运行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()

谢谢。

0 个答案:

没有答案