apache-spark - 避免排队火花微批处理
问题描述
我创建了 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
解决方案
您可以使用锁定机制。您需要在调度程序端维护单行数据以进行锁定。因此,当您的 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时,它将锁更改为以便可以运行下一个作业。如果作业失败,我也会处理这个问题,所以当作业因任何原因失败时,它会将锁定标记为True
True
finish
False
False
这样下一个触发器就可以毫无问题地运行。
根据要求,您可能需要更改一些东西。
推荐阅读
- sas - 需要根据个别阳性测试结果保留实验室类别测试
- c++ - --DDISPLAY 标志有什么作用,如何从 pkg-config 调用它?
- arrays - 将数组位置分配给标签标记属性
- oracle - 如何从远程机器运行 Expdp?
- azure - 在需要身份验证才能访问的方案中使用 Azure CDN 的最佳做法?
- civicrm - CiviCRM 问候语(电子邮件和邮政)中可用的所有可能变量字段是什么?
- python - Pandas 为新列分配值时出现问题
- php - 如何优化此 SQL 查询以过滤长文本/JSON 字段
- amazon-web-services - AWS IAM 用户可以通过 kubectl 访问 EKS 集群,但不能在 EKS 控制台上访问?
- javascript - 在 DOM 上执行 Javascript 后,我还能使用 PHP 的 image/png 标头吗?