【发布时间】:2018-08-12 06:43:51
【问题描述】:
我有一个用于图像识别的近乎实时的火花流应用程序,其中接收器从 kafka 获取输入帧。我每个执行器有 6 个接收器,总共 5 个执行器,我可以在 Spark UI 上每次迭代看到 30 个活动任务。
我的问题是 spark 能够从 kafka 读取 850 帧/秒,但处理任务非常缓慢,这就是为什么我面临与背压相关的问题。在每个批次中,任务预计会运行一些 tensorflow 模型,首先使用 keras.model_loads 加载它们,然后执行其他相关处理以从模型中获取预测。第一个张量流模型的输出是第二个张量流模型的输入,第二个张量流模型也加载另一个模型并在其之上执行预测。现在 #2 的最终输出是模型 #3 的输入,它做同样的事情,加载模型并执行预测。最终的预测是发回 kafka 到另一个主题。每个任务都有这个流程,处理单个任务的总体延迟在 10 到 15 秒之间,这对于 Spark 流应用程序来说是巨大的
谁能帮助我,我怎样才能使这个程序快速?
请记住,我必须在我的程序中使用这些自定义 tensorflow 模型才能获得最终输出。
我心里有以下想法:
选项 1 - 将 spark 流替换为结构化流
选项 2 - 中断顺序处理并将每个子进程放在单独的 RDD 中,即 RDD1 中的模型#1 处理,RDD2 中的模型#2 处理等等
选项 3 - 仅在 spark 中重写自定义 tensorflow 功能,目前这是我在每个任务中使用的单个 python 程序。但是,我对这个选项还不是很确定,到目前为止甚至没有检查过可行性。但是我假设如果我能够做到这一点,我将完全控制模型的分布。因此,可以在 AWS 集群上的 GPU 机器上快速处理这些任务,这目前还没有发生。
【问题讨论】:
标签: apache-spark tensorflow pyspark apache-kafka