【问题标题】:temp files remain in GCS after a Dataflow job "succeeded"Dataflow 作业“成功”后,临时文件仍保留在 GCS 中
【发布时间】:2016-10-02 23:44:36
【问题描述】:

我的团队每小时/每天运行几个 Dataflow 作业,这些作业主要从 GCS 读取和写入(也就是说,我们有几十个定期运行的 Dataflow 作业计划在一天内运行)。 一些作业从 GCS 读取先前作业产生的数据。 每周大约有一次或两次,我们会遇到以下问题:

  • 作业 A 成功运行,并将其输出写入位于 gs://A/output/ 的 GCS。

  • (我们确定的工作 A 和工作 B 之间发生的主要问题将在下一段中描述)。

  • 作业 B 从 gs://A/output 读取以处理一些数据,但由于在作业运行时删除了临时文件或由于临时文件导致数据中的键不存在而引发异常更长的唯一性(例如,如果作业 B 创建了上述数据的 MapView,则会发生这种情况)。

所以,就我们能够调试而言,原因如下:

  • 到作业 A 完成时(根据其管道状态,例如),gs://A/output/ 下的所有“临时”文件都应重命名为由工作。

  • 然而,其中一些临时文件会在作业 A 完成后持续存在几分钟 - 有时,我们甚至会在作业 A 完成几小时后看到这些临时文件,因此我们经常不得不删除它们手动。

  • 例如,在目录中的约 7,500 个文件中,我们只看到一两个临时文件徘徊,它们通常会在一个小时内消失,但有时会保留几个小时。

我们想知道以下几点:

  • 我们的理解是否正确,即 GCS 输出目录中的所有“临时”文件都应在作业 A“完成”之前重命名(例如,在监控 UI 上它说它成功,并且它已经停止了工作池等)?换句话说,作业的完成是否表明临时文件已经消失?

    • 如果是,我们在作业完成后很长时间才能看到临时文件,这是一个错误吗?

    • 如果不是,我们(用户)如何知道作业“真正”完成了,因为它的输出目录不包含临时文件? (我们应该用我们自己的文件模式匹配脚本或类似的东西来检查它吗?)

我使用 GCS 和 Dataflow 作为关键字进行了一些搜索,但没有找到与我们遇到的问题相近的内容 - 但我可能遗漏了一些东西,因此非常感谢任何帮助!

【问题讨论】:

    标签: google-cloud-dataflow


    【解决方案1】:

    很抱歉给您带来麻烦。这是TextIO.Write中的一个bug,是因为删除临时文件时遇到GCS eventual consistency,无法找到并全部删除。

    幸运的是,在将临时文件复制到最终位置时,它仍然会查看所有正确的文件,因此不会丢失数据。

    我们会考虑提供修复。

    请注意,再次由于 GCS 最终一致性,作业 B 也可能无法读取 A 生成的某些输出 - 即使有潜在的修复,这仍将保持不变,并且 Dataflow 没有简单的解决方法现在这个。但是,随着您增加完成 A 和开始 B 之间的间隔,这种可能性会降低。

    如果可能,我建议将 A 和 B 连接到单个管道中,将此数据表示为中间 PCollection。如果您需要将此数据物化为 GCS 上的文本以用于其他目的(例如,手动检查、服务、由不同工具处理等),您仍然可以通过此联合管道执行此操作,只是不要使用 GCS 传递一个管道和另一个管道之间的数据。

    【讨论】:

    • 感谢您的快速回复!不幸的是,这些文件仍然可用,因为作业 B 实际上读取了这些临时文件(除了常规文件),并抱怨存在“重复”(这不应该发生,因为作业 A 输出具有唯一键的数据)。看到这样的错误消息,我们的一位工程师会去检查临时文件,确实存在,通过 gsutil 命令手动删除它们(没有失败,表明这些文件存在),然后重新运行作业 B (然后运行没有错误)。所以我们面临的问题似乎有点不同。
    • 好的,我又读了你的问题,我想我们在谈论不同的事情。 “临时文件”是什么意思?您能否给我一个作业 A、B 的示例 Dataflow 作业 ID 和一个“延迟”文件的示例路径,并描述该文件应该发生什么以及实际发生了什么?
    • [post 1-of-2 due to char limit] Job A: 2016-10-01_20_56_19-5249395331261744641 这个工作写给 gs://dataflow-appprofile/2016-10-01/appprofile- daily-20161001-aaaaa-of-bbbbb。请注意,此作业于 2016 年 10 月 1 日晚上 9:47:55(太平洋时间)终止。作业 B:2016-10-01_21_52_18-1981569070131419993 当作业 B 在晚上 9:52 开始时,临时文件之一 (gs://dataflow-appprofile/2016-10-01/appprofile-daily-20161001-temp-3d1e4c54-901d -4db3-ac1d-8b47a6d8a5c8) 仍然存在,并且作业 B 失败(由于重复键)。
    • [post 2-of-2] 一段时间后,我们得知作业 B 失败,因此我们在晚上 10:06 重新运行作业 B(此时不知道临时文件)(作业 ID 2016-10-01_22_06_19-855456315573777776),由于同样的原因它失败了。大约晚上 10:15-10:20(因此在作业 A 终止后至少 30 分钟),我们手动删除了临时文件(通过“gsutil rm gs://dataflow-appprofile/2016-10-01/appprofile-daily-20161001 -temp-3d1e4c54-901d-4db3-ac1d-8b47a6d8a5c8"),第三次重新运行 Job B(Job ID 2016-10-01_22_29_23-12660764751435178410),终于成功了。
    • [update] 刚才又发生了一次。工作 A:2016-10-03_19_50_18-12148037691794303211(在晚上 8 点 36 分 59 分终止)这产生了 20 个文件和 4 个临时文件,直到现在才徘徊(如果需要,我制作了一个屏幕截图以保留它们的名称),我将其删除。作业 B 失败:2016-10-03_20_55_19-948013433821887252(晚上 8:55:19 开始,作业 A 完成后约 20 分钟)。
    猜你喜欢
    • 2021-10-30
    • 2022-01-08
    • 2021-09-03
    • 1970-01-01
    • 2014-11-26
    • 2021-03-08
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多