Spark Streaming 处理时间 vs 总延迟 vs 处理延迟
Spark Streaming Processing Time vs Total Delay vs Processing Delay
我试图了解 Spark Streaming 输出的不同指标的含义,我有点困惑处理时间、总延迟之间的区别最后一批的 和 处理延迟 ?
我看过 Spark Streaming 指南,其中提到 处理时间 作为判断系统是否落后的关键指标,但其他地方如“Pro Spark Streaming:使用 Apache Spark 进行实时分析的禅宗”谈论使用总延迟 和处理延迟 .我没有找到任何文档列出 Spark Streaming 生成的所有指标,并解释每个指标的含义。
如果有人能概述这三个指标中的每一个的含义或指出任何可以帮助我理解这一点的资源,我将不胜感激。
让我们分解每个指标。为此,让我们定义一个基本的流式应用程序,它以给定的 4 秒间隔从任意来源读取批次,并计算经典字数:
inputDStream.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
.saveAsTextFile("hdfs://...")
处理时间:计算给定批次的所有作业所需的时间,端到端。在我们的例子中,这意味着从 flatMap
开始并在 saveAsTextFile
结束的单个作业,并假定作业已提交作为先决条件。
Scheduling Delay: Spark Streaming scheduler 提交批处理作业所花费的时间。这是如何计算的?正如我们所说,我们的批处理每 4 秒从源中读取一次。现在让我们假设一个给定的批次需要 8 秒来计算。这意味着我们现在落后 8 - 4 = 4
秒,从而使调度延迟 4 秒。
总延迟:这是Scheduling Delay + Processing Time
。按照同一个例子,如果我们落后 4 秒,意味着我们的调度延迟是 4 秒,而下一批又花了 8 秒来计算,这意味着现在总延迟是 8 + 4 = 12
秒长。
来自工作流应用程序的实例:
我们看到:
- 底部作业用了 11 秒来处理。所以现在下一批次的调度延迟是
11 - 4 = 7
秒。
- 如果我们查看倒数第二行,我们会发现调度延迟 + 处理时间 = 总延迟,在这种情况下(将 0.9 舍入为 1)
7 + 1 = 8
.
我们的处理时间稳定,但调度延迟增加。
根据回答,调度延迟应该只受先前运行的处理时间影响。
Spark 运行 只是流媒体,没有别的。
时间 window 为 1 分钟,处理 120K 条记录。
如果你的 window 是 1 分钟,平均处理时间是 1 分 7 秒,你就有问题了:每批都会延迟下一批。
您的处理时间图表显示处理时间稳定,但始终高于批处理时间。
我认为在给定的时间后,您的驱动程序会因超出 GC 开销限制而崩溃,因为它将充满等待执行的待处理批处理。
您可以通过减少处理时间来更改此设置,使其低于预期的微批最大持续时间(需要代码 and/or 资源分配更改),或者增加微批大小,或者转为连续流。
Rgds
我试图了解 Spark Streaming 输出的不同指标的含义,我有点困惑处理时间、总延迟之间的区别最后一批的 和 处理延迟 ?
我看过 Spark Streaming 指南,其中提到 处理时间 作为判断系统是否落后的关键指标,但其他地方如“Pro Spark Streaming:使用 Apache Spark 进行实时分析的禅宗”谈论使用总延迟 和处理延迟 .我没有找到任何文档列出 Spark Streaming 生成的所有指标,并解释每个指标的含义。
如果有人能概述这三个指标中的每一个的含义或指出任何可以帮助我理解这一点的资源,我将不胜感激。
让我们分解每个指标。为此,让我们定义一个基本的流式应用程序,它以给定的 4 秒间隔从任意来源读取批次,并计算经典字数:
inputDStream.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
.saveAsTextFile("hdfs://...")
处理时间:计算给定批次的所有作业所需的时间,端到端。在我们的例子中,这意味着从
flatMap
开始并在saveAsTextFile
结束的单个作业,并假定作业已提交作为先决条件。Scheduling Delay: Spark Streaming scheduler 提交批处理作业所花费的时间。这是如何计算的?正如我们所说,我们的批处理每 4 秒从源中读取一次。现在让我们假设一个给定的批次需要 8 秒来计算。这意味着我们现在落后
8 - 4 = 4
秒,从而使调度延迟 4 秒。总延迟:这是
Scheduling Delay + Processing Time
。按照同一个例子,如果我们落后 4 秒,意味着我们的调度延迟是 4 秒,而下一批又花了 8 秒来计算,这意味着现在总延迟是8 + 4 = 12
秒长。
来自工作流应用程序的实例:
我们看到:
- 底部作业用了 11 秒来处理。所以现在下一批次的调度延迟是
11 - 4 = 7
秒。 - 如果我们查看倒数第二行,我们会发现调度延迟 + 处理时间 = 总延迟,在这种情况下(将 0.9 舍入为 1)
7 + 1 = 8
.
我们的处理时间稳定,但调度延迟增加。
根据回答,调度延迟应该只受先前运行的处理时间影响。
Spark 运行 只是流媒体,没有别的。
时间 window 为 1 分钟,处理 120K 条记录。
如果你的 window 是 1 分钟,平均处理时间是 1 分 7 秒,你就有问题了:每批都会延迟下一批。
您的处理时间图表显示处理时间稳定,但始终高于批处理时间。
我认为在给定的时间后,您的驱动程序会因超出 GC 开销限制而崩溃,因为它将充满等待执行的待处理批处理。
您可以通过减少处理时间来更改此设置,使其低于预期的微批最大持续时间(需要代码 and/or 资源分配更改),或者增加微批大小,或者转为连续流。
Rgds