我正在使用Spark结构化流媒体来吸收来自Kafka的事件并将其上传到S3。
检查点在S3上提交:
DataFrameWriter<Row> writer = input.writeStream()
.format("orc")
.trigger(ProcessingTime(config.getProcessingTime()))
.outputMode(OutputMode.Append())
.option("truncate", false)
.option("checkpointLocation", "s3://bucket1")
.option("compression", "zlib")
.option("path", "s3://bucket2");
偏移量通过StreamingQueryListener
提交给Kafka:
kafkaConsumer.commitSync(topicPartitionMap);
启动应用程序后,它将从Kafka检索偏移量图并启动流:
reader = sparkSession
.readStream()
.format("kafka")
.option("kafka.bootstrap.servers", config.getKafkaBootStrapServers())
.option("subscribe", "topic1")
.option("max.poll.records", 1000)
.option("failOnDataLoss", false)
.option("startingOffsets", topicPartitionMap)
我将topic/partition/offset
和数据存储在ORC文件中。
数据包含事件的多个重复项,且重复项的精确度为topic/partition/offset
。
应如何配置流以实现恰好一次处理?
答案 0 :(得分:3)
发现这些参数应设置为true
spark.streaming.driver.writeAheadLog.closeFileAfterWrite
和spark.streaming.receiver.writeAheadLog.closeFileAfterWrite
当您要将S3用作元数据WAL时,请将其设置为“ true”