【问题标题】:Huge latency in spark streaming job火花流作业中的巨大延迟
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复!!我发现大部分延迟发生在模型对象创建时。现在的问题是,我们能不能只在执行器级别进行一次对象初始化?这样我就可以重用该对象,而不必为每次调用重新创建它。我知道 IPC 可能是一种出路,但根据我的理解,共享内存保存对象字节而不是实际对象。请帮忙
    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2020-03-10
    • 1970-01-01
    • 2018-08-01
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多