火花流作业中存在巨大的延迟



我有一个近乎实时的图像识别火花流应用程序,接收器从 kafka 获取输入帧。我每个执行器有 6 个接收器,总共 5 个执行器,我可以在 Spark UI 上看到每次迭代 30 个活动任务。

我的问题是 Spark 能够从 kafka 读取 850 帧/秒,但处理任务的速度非常慢,这就是我面临背压相关问题的原因。在每个批处理中,任务应运行几个张量流模型,方法是首先使用 keras.model_loads 加载它们,然后执行其他相关处理,以便从模型中获取预测。第一个张量流模型的输出是第二个张量流模型的输入,而第二个张量流模型又加载另一个模型并在其上执行预测。现在,#2 的输出最终是模型 #3 的输入,它们执行相同的操作,加载模型并执行预测。最后的预测是发回 kafka 到另一个主题。为每个任务提供此流程,处理单个任务的总体延迟在 10 到 15 秒之间,这对于 Spark 流应用程序来说是巨大的

谁能帮我,我怎样才能使这个程序快速?

请记住,我必须在程序中使用这些自定义张量流模型来获得最终输出。

我心中有以下想法:

  • 选项 1 - 将火花流式处理替换为结构化流式处理

  • 选项 2 - 中断顺序处理并将每个子进程放在单独的 RDD 中,即 RDD1 中的模型 #1 处理,RDD2 中的模型 #2 处理等

  • 选项 3 - 仅在 Spark 中重写自定义 tensorflow 功能,目前这是我在每个任务中使用的单个 python 程序。但是,我还不确定此选项,到目前为止甚至没有检查可行性。但是我假设的是,如果我能够做到这一点,我将完全控制模型的分布。因此,可以在 AWS 集群上的 GPU 计算机上快速处理这些任务,而目前尚未发生。

调整火花作业是最耗时的部分,您可以尝试以下选项 -

  • 通过此链接,这对于任何火花作业调整 http://spark.apache.org/docs/latest/streaming-programming-guide.html#performance-tuning 都是必须
  • 尝试使用直接 kafka 摄取,而不是基于接收器的方法。
  • 尝试从日志中分析并找出执行中最耗时的部分。如果自定义代码由于顺序处理而花费很长时间,则火花调整将无济于事。

最新更新