首页 > 解决方案 > 避免排队火花微批处理

问题描述

我创建了 spark 应用程序,它从 Apache flume 获取输入数据。我将 spark 批处理间隔设置为 4 分钟,这样 spark 将每 4 分钟处理一次数据。但是我有一些昂贵的 spark 批处理需要相当长的时间(比如 30 分钟),因此在此期间大约 7 个 spark 批处理将在队列中挂起,一旦完成昂贵的批处理执行,它将开始一个接一个地处理。通过这种方式,我的火花在最大时间内保持忙碌。那么我怎样才能避免这种排队呢?如果我的 spark 批处理正在执行并且需要超过 4 分钟,我不想在队列中添加下一个 spark 批处理。

我正在启动火花如下

val ssc = new StreamingContext(sc, 240000)// 240000 equals to 4 minutes

标签: apache-sparkspark-streaming

解决方案


您可以使用锁定机制。您需要在调度程序端维护单行数据以进行锁定。因此,当您的 spark 作业将在 4 分钟后触发时,它将首先检查该文件/数据库表,如果它返回锁True,那么它将terminate什么都不做。

我在我的 spark 工作中也使用了相同的方法,每3 分钟触发一次。因此,我在ElasticSearch Index 上进行维护,在该索引中保存带有application id, start and End time, spark Job Name, Status, Lock. 因此,当 Spark 作业触发时,它首先检查该索引是否锁定,False然后它与其他详细信息overwrite的行/记录开始运行,否则如果锁定,则它通过记录一条消息来停止执行,该消息表明具有 spark 作业名称的应用程序 ID 正在运行。3 分钟后,新的 Spark 作业重新触发并再次检查所有内容。当 spark job get时,它将锁更改为以便可以运行下一个作业。如果作业失败,我也会处理这个问题,所以当作业因任何原因失败时,它会将锁定标记为TrueTruefinishFalseFalse这样下一个触发器就可以毫无问题地运行。

根据要求,您可能需要更改一些东西。


推荐阅读