【问题标题】:What is the correct way for share dataframes between components?在组件之间共享数据框的正确方法是什么?
【发布时间】:2021-07-29 16:37:45
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: python dataframe amazon-s3 kubeflow kubeflow-pipelines


    【解决方案1】:

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

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

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

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

    所以问题是:

    • 步骤idempotent(可重启)吗?
    • 管道多久失败一次?
    • 从某个中间点重新开始处理是否容易?
    • 您是否更关心处理时间而不是失去一些工作的风险?
    • 您是否关心 S3 存储/传输所产生的成本?

    【讨论】:

    • 但是我可以理解您想要存储数据帧以便不从 scatch 启动管道,但无论如何不是最好的选择传递组件并且只存储在每个组件的末尾?
    • 对不起,我不明白这个问题。你能改写一下吗?
    • >"缺点是:如果你在管道中途失败,你必须从头开始。" - 我不确定是不是这样。缓存功能确保管道可以再次启动,并且只会执行未完成的步骤。事实上,选项 2 更安全,因为它不使用会损坏并破坏一切的可变外部状态。
    • @Ark-kun:你是说Kubeflow Pipeline caching吗?事实上,它似乎提供了步骤缓存,你可能是对的。
    • 是的,我指的是 Kubeflow Pipelines 的执行缓存。
    【解决方案2】:

    问题在于这是否是最佳实践

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多