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

What is the correct way for share dataframes between components?

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

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

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

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

谢谢

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

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

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

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

所以问题是:

  • 步骤 idempotent(可重启)吗?
  • 管道发生故障的频率如何?
  • 从某个中点重新开始处理容易吗?
  • 与失去工作的风险相比,您更关心处理时间吗?
  • 您关心 S3 产生的成本吗storage/transfer?

The question is about if this is a best practice

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

or is better to share the data frame directly between components

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

because the upload to the S3 can fail, and then fail the pipeline.

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

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