结构化流:其背后的哲学

在我们以前的博客中:

  1. 结构化流:这是什么? 和
  2. 结构化流:如何工作?

我们了解了有关结构化流媒体的2个要点–

  1. 它是一种快速,可扩展,容错,端到端,一次精确的流处理API,可帮助用户构建流应用程序。
  2. 它将实时数据流视为正在不断添加/更新的表,这使我们能够像在静态表上一样将流计算表示为标准的类似批处理的查询,而Spark将其作为无限制输入表上的增量查询运行。

在此博客文章中,我们将讨论结构化流的原理或编程模型。 因此,让我们从上一篇博客文章中看到的示例开始。

[要点https://gist.github.com/gupta-himanshu/a6c31e0e6c28d8705debaef38b2c215c /]

上例中的查询将生成一个“ 结果表 ”(在后台)。 每次推送新数据(插入套接字的字),新行都会追加/更新到“ 结果表 ”中。 现在,无论何时更新结果表,更改后的结果行都会发送到外部接收器(在上面的示例中为控制台)。 为了更好地理解工作流程,让我们看一下下图:

在这里我们可以清楚地看到,如果将新数据推送到源,Spark将运行“ 增量 ”查询,该查询将先前的运行计数与新数据结合起来以计算更新的计数。 这里的“ 输入表 ”是DataFrame ,用作wordCounts DataFrame的流输入。

现在,上图中唯一未知的是“ 完整模式 ”。 它不过是结构化流中可用的三种输出模式之一。 由于它们是结构化流的重要组成部分,因此,让我们详细了解它们:

  1. 完整模式 -此模式更新整个结果表,最终将其写入接收器。
  2. 追加模式 -在此模式下,仅新行会追加到结果表中,并最终发送到接收器。
  3. 更新模式 -最后,此模式仅更新自上次触发以来结果表中已更改的行。 同样,只有新行发送到接收器。 关于此模式,有一件特别的事情要注意,即,它与完整模式的不同之处在于此模式仅输出自上次触发以来已更改的行。 如果查询不包含任何聚合,则等同于Append模式

最后,只有一件事要注意,即结构化流不会实现整个表。 它只是从流数据源中读取最新的可用数据,对其进行增量处理以更新结果,然后丢弃该源数据。 它仅保留更新结果所需的最小中间状态数据,即上述示例中的中间计数。

此模型与许多其他流处理引擎有很大不同,在其他流处理引擎中,它们要求用户自己维护运行中的聚合,因此必须考虑容错和数据一致性(至少一次/每次最多/一次) )。 在此模型中,Spark负责在有新数据可用时更新“ 结果表 ”,从而使用户不必对此进行推理。

因此,这就是结构化流的整个哲学。 希望你喜欢。 如果您有任何意见或建议,请在下面留言。

我们将回来更多关于结构化流的博客。 直到敬请期待🙂