我正在试着找出什么是更好的方法。
我有一个火花批处理作业,这是计划运行每5分钟,它需要2-3分钟来执行。
由于Spark 2.0已经添加了对动态分配spark.streaming.dynamicAllocation.enabled的支持,将其设置为每5分钟从源拉取数据的流式作业是一个好主意吗?
在流/批处理作业之间进行选择时,我应该记住哪些事项?
发布于 2019-07-24 01:35:16
在流和批处理之间做出决定时,需要考虑各种因素。我在下面列出了一些,根据你的用例,你可以决定哪一个更合适。
1) 输入数据特征-连续输入与批量输入
如果输入数据是批量到达的,则使用批处理。
否则,如果输入数据是连续到达的,流处理可能更有用。考虑其他因素以得出结论。
2) 输出延迟
如果所需的输出延迟非常小,请考虑流处理。
否则,如果输出延迟无关紧要,请选择批处理。
3) 批量大小(时间)
一般的经验法则是,如果批处理大小>1分钟,则使用批处理,否则需要流处理。这是因为批处理的触发/衍生增加了总处理时间的延迟。
4) 资源使用
集群中资源的使用模式是什么?
是否有更多的批处理作业在其他批处理作业完成后执行?使多个批处理作业一个接一个地运行,并以最佳方式使用集群资源。那么使用批处理作业是更好的选择。
批处理作业在其调度时间运行,在此之后集群中的资源处于空闲状态。考虑运行流式作业如果数据连续到达,则处理所需的资源可能会更少,并且输出将变得可用,延迟更短。
还有其他需要考虑的事情-回放,可管理性(流媒体更复杂),团队的现有技能等。
关于spark.streaming.dynamicAllocation.enabled,的,我会避免使用它,因为如果输入的速率变化很大,执行器将被频繁地终止和创建,这将增加延迟。
发布于 2019-07-24 00:30:27
Spark流媒体是一项过时的技术。它的后继者是结构化流媒体。
如果你每隔5分钟进行一次处理,那么你就需要进行批处理。您可以使用结构化流框架,并每隔5分钟触发一次,以模拟批处理,但我通常不会这样做。
结构化流媒体比普通的Spark有更多的限制。例如,您只能写入Kafka或一个文件,否则您需要使用Foreach接收器自己实现接收器。同样,如果你使用一个文件接收器,那么你不能更新它,而只能追加到它。此外,还有一些操作在结构化流式传输中不受支持,还有一些操作只有在之前执行聚合操作后才能执行。
如果我从Kafka读取或写入Kafka,我可能会使用结构化Straming进行批处理,因为它们在一起工作得很好,而且所有东西都是预先实现的。使用结构化流式传输的另一个优点是,您可以自动从您停止阅读的位置继续阅读。
有关更多信息,请参阅Structured Streaming Programming Guide。
https://stackoverflow.com/questions/57168267
复制相似问题