Scala 火花检查点对性能的影响
从Spark看来,检查点机制似乎收集要检查的Scala 火花检查点对性能的影响,scala,apache-spark,bigdata,spark-streaming,Scala,Apache Spark,Bigdata,Spark Streaming,从Spark看来,检查点机制似乎收集要检查的时间窗口,并将其更新/写入检查点文件。我试图具体了解两件事: 在每个检查点间隔,它是否读取所有以前的检查点数据,然后更新当前状态?。如果是这样,当检查点状态变得非常大时,会对性能产生什么影响,这肯定会减慢长时间运行的流上下文 对于不同的数据摄取率、滑动窗口和批处理间隔,是否有计算检查点间隔的一般规则或公式 是的,检查点是一种阻塞操作,因此它在活动期间停止处理。这种状态序列化停止计算的时间长度取决于您将其写入的介质的写入性能(您听说过Tachyon/Al
时间
窗口,并将其更新/写入检查点文件。我试图具体了解两件事:
bi
秒批处理时间间隔内,以bp
秒批处理时间,您需要c
秒的时间来检查点,您将在以下位置从检查点“恢复”(处理在未处理时间内仍然进入的数据):
ceil(c/(bi-bp))
batches
如果您需要k
批从检查点“恢复”(即恢复检查点导致的延迟),并且您正在检查每个p
批,则需要确保强制执行k
,以避免作业不稳定。在我们的例子中:
- 因此,如果检查点需要10秒,那么恢复将需要10/(30-25)=2个批次,因此您可以每2个批次检查一次(或更多,即不太频繁,我建议考虑计划外的时间损失)
- 所以,如果检查点需要30秒,那么恢复需要30/(30-25)=6个批次,所以您可以每6个批次(或更多)检查一次
- 如果检查点需要60秒,则可以每12批(或更多批)检查一次
updateStatebyKey
或mapWithState
之类的操作删除有状态流中的部分状态,但状态的大小应该始终是有界的。请注意,在多租户群集上,写入磁盘所花费的时间并不总是一个常数-其他作业可能正试图在同一执行器上并发访问磁盘,从而使您无法获得磁盘iops(在Cloudera报告中,IO吞吐量在超过5个并发写入线程后急剧下降)
注意:您应该设置检查点间隔,因为默认值是在最后一批之后超过默认检查点间隔的第一批,即10秒。对于我们的30秒批间隔示例,这意味着您每隔一批检查一次。出于纯粹的容错原因(如果重新处理几个批次没有那么大的成本),即使按照您的计算预算是允许的,也经常出现这种情况,并导致性能图中出现以下峰值: