【问题标题】: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。