5分钟Spark批处理作业与流式处理作业

时间:2019-07-23 16:09:55

标签: apache-spark spark-streaming

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

我有一个Spark Ba​​tch Job,它计划每5分钟运行一次,并且需要2-3分钟才能执行。

由于Spark 2.0增加了对动态分配spark.streaming.dynamicAllocation.enabled的支持,因此使其流传输工作每5分钟从源中提取一次数据是个好主意吗?

在流/批处理作业之间进行选择时,我应该牢记什么?

2 个答案:

答案 0 :(得分:0)

火花流是一种过时的技术。它的后继者是结构化流。

如果每5分钟进行一次处理,则可以进行批处理。您可以使用结构化流框架并每5分钟触发一次,以模仿批处理,但是我通常不会这样做。

结构化流媒体比普通Spark有更多的限制。例如,您只能写入Kafka或文件,否则您需要使用Foreach接收器自己实现接收器。同样,如果您使用文件接收器,则不能对其进行更新,而只能对其进行附加。此外,还有结构化流式传输中不支持的操作,除非您之前进行了农耕,否则您将无法执行某些操作。

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

有关更多信息,请参见Structured Streaming Programming Guide

答案 1 :(得分:0)

要在流式处理还是批处理之间进行选择,需要研究各种因素。我在下面列出了一些内容,根据您的用例,您可以决定哪个更合适。

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

如果要批量输入数据,请使用批处理。

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

2)输出延迟

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

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

3)批量大小(时间)

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

4)资源使用情况

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

完成其他批处理作业后,是否还有更多的批处理作业执行?具有一个以上的批处理作业接连运行并且正在使用群集可以最佳地实现目标。然后拥有批处理作业是更好的选择。

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

还有其他要考虑的因素-重播,可管理性(流媒体更为复杂),团队现有技能等。

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