我希望有一个Spark Streaming SQS Receiver ,只有在成功存储在S3上之后才会删除SQS消息。
为此,可以使用可靠接收器的语义实现自定义接收器。
store(multiple-records)
调用blocks until已在Spark中存储和复制给定记录。
如果启用了预写日志,则从接收方收到的所有数据都会被写入into a write ahead log in the configuration checkpoint directory。检查点目录可以指向S3。
store(multiple-records)
阻塞调用完成后,记录是否已存储在检查点目录中(因此可以安全地从SQS中删除)?
答案 0 :(得分:1)
编辑:this Spark Summit presentation中也解释了这一点。
启用预写日志和检查点后,store(multiple-records)
调用将阻塞,直到给定的记录写入预写日志为止。
Receiver.store(ArrayBuffer[T], ...)
ReceiverSupervisorImpl.pushArrayBuffer(ArrayBuffer[T], ...)
ReceiverSupervisorImpl.pushAndReportBlock(...)
WriteAheadLogBasedBlockHandler.storeBlock(...)
This implementation将块存储到块管理器以及写入日志中。它使用Scala Futures并行执行此操作,并且仅在块存储在两个位置后才返回。