仅一次执行Spark结构化流传输-未实现-重复事件

时间:2019-03-21 14:17:40

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

我正在使用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

应如何配置流以实现恰好一次处理?

1 个答案:

答案 0 :(得分:3)

发现这些参数应设置为true spark.streaming.driver.writeAheadLog.closeFileAfterWritespark.streaming.receiver.writeAheadLog.closeFileAfterWrite

  

当您要将S3用作元数据WAL时,请将其设置为“ true”

https://spark.apache.org/docs/latest/configuration.html

更多详细信息在这里: https://www.waitingforcode.com/apache-spark-streaming/spark-streaming-configuration/read?fbclid=IwAR17x1AfTLH1pjq1QPkDsQT6DU4hgi7WNeIYUnw25Hvquoj-4yQU10R0GeM