【问题标题】:5 Minutes Spark Batch Job vs Streaming Job5 分钟 Spark 批处理作业与流式作业
【发布时间】:2019-07-24 05:08:54
【问题描述】:

我正在尝试找出更好的方法。

我有一个 Spark 批处理作业,它计划每 5 分钟运行一次,执行需要 2-3 分钟。

由于Spark 2.0 增加了对动态分配spark.streaming.dynamicAllocation.enabled 的支持,将其设为每5 分钟从源中提取数据的流式作业是否是个好主意?

在流式传输/批处理作业之间进行选择时我应该记住哪些事项?

【问题讨论】:

    标签: apache-spark spark-streaming


    【解决方案1】:

    在流式传输与批处理之间做出决定时,需要考虑各种因素。我在下面列出了一些,根据您的用例,您可以决定哪个更合适。

    1) 输入数据特征 - 连续输入与批量输入

    如果输入数据成批到达,请使用批处理。

    否则,如果输入数据连续到达,流处理可能更有用。考虑其他因素以得出结论。

    2) 输出延迟

    如果所需的输出延迟非常小,请考虑流处理。

    否则,如果输出延迟无关紧要,请选择批处理。

    3) 批量大小(时间)

    一般的经验法则是,如果批量大小 > 1 分钟,则使用批处理,否则需要流处理。这是因为批处理的触发/生成会增加整体处理时间的延迟。

    4) 资源使用情况

    您的集群中资源的使用模式是什么?

    当其他批处理作业完成时是否有更多批处理作业执行?让多个批处理作业一个接一个地运行,并以最佳方式使用集群资源。那么拥有批处理作业是更好的选择。

    批处理作业按计划时间运行,之后集群中的资源处于空闲状态。如果数据连续到达,请考虑运行流式作业,处理所需的资源可能会更少,并且输出可用时延迟更短。

    还有其他需要考虑的事情 - 重播、可管理性(流媒体更复杂)、团队现有技能等。

    关于 spark.streaming.dynamicAllocation.enabled,我会避免使用它,因为如果输入速率变化很大,执行器将被杀死并非常频繁地创建,这会增加延迟。

    【讨论】:

      【解决方案2】:

      Spark Streaming 是一种过时的技术。它的继任者是结构化流媒体。

      如果您每 5 分钟处理一次,那么您就进行批处理。你可以使用 Structured Streaming 框架,每 5 分钟触发一次来模拟批处理,但我通常不会这样做。

      结构化流比普通的 Spark 有更多的限制。例如,您只能写入 Kafka 或文件,否则您需要使用 Foreach 接收器自己实现接收器。此外,如果您使用文件接收器,则无法更新它,而只能附加到它。还有一些操作在结构化流中不受支持,并且有些操作除非您之前进行聚合,否则您无法执行。

      如果我从 Kafka 读取或写入 Kafka,我可能会使用 Structured Straming 进行批处理,因为它们可以很好地协同工作并且一切都是预先实现的。使用结构化流的另一个优点是您可以自动从停止的地方继续阅读。

      更多信息请参考Structured Streaming Programming Guide

      【讨论】:

      • 大部分是真的,但已经过时了
      猜你喜欢
      • 2017-03-29
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      相关资源
      最近更新 更多