在组件之间共享数据帧的正确方法是什么?

问题描述

我正在处理 Kubeflow 的一个遗留项目,管道有一些组件,以便将某种过滤器应用于数据帧。

为了做到这一点,每个组件从 S3 下载数据帧应用过滤器并再次上传到 S3。

在数据框用于训练或验证模型的组件中,从 S3 下载数据框。

问题是这是否是最佳实践,还是直接在组件之间共享数据帧更好,因为上传到 S3 可能会失败,然后使管道失败。

谢谢

解决方法

与要求“最佳”或“推荐”方法的问题一样,主要答案是:“视情况而定”。

但是,在您的案例中,有一些值得说明的注意事项。

  1. 在管道步骤之间保存到 S3。 这会存储管道的中间结果,只要这些步骤需要很长时间并且可以重新启动,就值得这样做。 “长时间”的含义取决于您的用例。

  2. 将数据直接从组件传递到组件。这可以节省您的存储吞吐量,并且很可能节省了在 S3 中存储数据和从 S3 检索数据的时间。缺点是:如果您在管道中途失败,则必须从头开始。

所以问题是:

  • 步骤 idempotent 是否(可重新启动)?
  • 管道发生故障的频率如何?
  • 从某个中点重新开始处理是否容易?
  • 您是否更关心处理时间而不是失去一些工作的风险?
  • 您是否关心 S3 存储/传输所产生的成本?
,

问题是这是否是最佳实践

最佳实践是使用基于文件的 I/O 和内置数据传递功能。当前实现将输出数据上传到上游组件中的存储并下载下游组件中的数据。这是最安全、最便携的选项,应该一直使用,直到您发现它不再适合您(100GB 数据集可能无法可靠地工作)。

或者最好在组件之间直接共享数据框

如何在不同机器上的容器中运行的不同 Python 程序之间“直接共享”内存中的 Python 对象?

因为上传到 S3 可能会失败,然后管道也会失败。

失败的管道可以重新启动。缓存功能将确保已经完成的任务不会被重新执行。

无论如何,有什么选择?如何在分布式容器化程序之间发送数据而不通过网络发送数据?