Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 火花检查点对性能的影响_Scala_Apache Spark_Bigdata_Spark Streaming - Fatal编程技术网

Scala 火花检查点对性能的影响

Scala 火花检查点对性能的影响,scala,apache-spark,bigdata,spark-streaming,Scala,Apache Spark,Bigdata,Spark Streaming,从Spark看来,检查点机制似乎收集要检查的时间窗口,并将其更新/写入检查点文件。我试图具体了解两件事: 在每个检查点间隔,它是否读取所有以前的检查点数据,然后更新当前状态?。如果是这样,当检查点状态变得非常大时,会对性能产生什么影响,这肯定会减慢长时间运行的流上下文 对于不同的数据摄取率、滑动窗口和批处理间隔,是否有计算检查点间隔的一般规则或公式 是的,检查点是一种阻塞操作,因此它在活动期间停止处理。这种状态序列化停止计算的时间长度取决于您将其写入的介质的写入性能(您听说过Tachyon/Al

从Spark看来,检查点机制似乎收集要检查的
时间
窗口,并将其更新/写入检查点文件。我试图具体了解两件事:

  • 在每个检查点间隔,它是否读取所有以前的检查点数据,然后更新当前状态?。如果是这样,当检查点状态变得非常大时,会对性能产生什么影响,这肯定会减慢长时间运行的流上下文

  • 对于不同的数据摄取率、滑动窗口和批处理间隔,是否有计算检查点间隔的一般规则或公式

  • 是的,检查点是一种阻塞操作,因此它在活动期间停止处理。这种状态序列化停止计算的时间长度取决于您将其写入的介质的写入性能(您听说过Tachyon/Alluxio吗?)

    另一方面,以前的检查点数据不会在每次新的检查点操作中读取:在对流进行操作时,有状态信息已经保存在Spark的缓存中(检查点只是它的备份)。让我们设想一种最简单的状态,所有整数的总和,在一个整数流中相遇:在每个批次上,您根据在批次中看到的数据计算该总和的一个新值,并且您可以将该部分总和存储在缓存中(见上文)。大约每五个批次(取决于检查点间隔)将此总和写入磁盘。现在,如果您在后续批处理中丢失了一个执行器(一个分区),您可以通过仅重新处理该执行器的分区(最多五个分区)(通过读取磁盘以查找最后一个检查点,并重新处理最后五个批处理中缺失的部分)来重建总数。但在正常处理(无事故)中,您无需访问磁盘

  • 我所知道的没有通用公式,因为您必须确定希望从中恢复的最大数据量。旧的文档提供了一些新的信息

    但是在流式处理的情况下,您可以将批处理间隔视为计算预算。假设批处理间隔为30秒。在每个批处理中,您有30秒的时间用于写入磁盘或计算(批处理时间)。为了确保作业稳定,您必须确保批处理时间不超过预算,否则您将填满集群的内存(如果处理和“刷新”需要35秒)30秒的数据,在每批中,您摄取的数据比您在同一时间内刷新的数据多——因为您的内存是有限的,这最终会导致数据过量)

    假设您的平均批处理时间为25秒。因此,在每个批次中,您的预算中有5秒的未分配时间。您可以将其用于检查点。现在考虑检查点需要多长时间(你可以从SoC UI中取笑这一点)。10秒?30秒?一分钟

    如果在
    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秒批间隔示例,这意味着您每隔一批检查一次。出于纯粹的容错原因(如果重新处理几个批次没有那么大的成本),即使按照您的计算预算是允许的,也经常出现这种情况,并导致性能图中出现以下峰值: