如何在不影响语义版本的情况下强制增量Foundry Transforms作业以非增量方式构建



如何在不更改transforms repo中的语义版本的情况下强制以非增量方式构建特定数据集?

关于我们具体用例的详细信息:

我们有大约50个数据集,由单个增量python通过手动注册和for循环定义。这种转换的输入可以是100到10000个小的gzip文件,因此当较大的数据集运行时,它最终将所有这些文件划分为少数大小合适的拼花文件,这非常适合我们的下游工作。然而,在这个作业已经增量运行了几个月(文件每小时到达一次(之后,输出中也会有大量的小拼花文件。我们希望能够强制构建该单个数据集的快照,而不必碰撞转换的语义版本,这将触发所有50个数据集的创建快照。这可能吗?

我理解一种潜在的变通方法可以是定义";最大输出文件";在转换本身中,读取现有输出中的当前文件数,如果当前文件数超过最大值,则强制执行快照。然而,由于该管道对时间敏感(需要在一小时内运行(,这将给管道带来一定程度的不可预测性,因为快照构建需要更长的时间。我们希望能够将这些完整的快照构建设置为大约每月在周末运行一次。

在输出数据集上提交一个空的追加事务。

我现在更喜欢的方法是使用我称之为";快照数据集";。这种方法允许您在任意点将快照事务注入管道,并定期安排快照构建,这对于保持长期低延迟管道的性能非常有用。

为此,我在声明转换时使用了一个包装器(在我的情况下是java转换,但它类似于python(,它为我的转换添加了额外的输入。

假设您从读取数据集AB并生成数据集C的转换开始。包装器将插入一个称为CSnapshotDataset的附加数据集作为输入,并生成一个生成此(空(数据集的转换。

生成CSnapshotDataset的自动生成的转换在构建数据集时总是将空的SNAPSHOT事务放入数据集中。当CSnapshotDataset中有一个新的快照事务时,您的转换也将输出一个快照事务。

然后,要从给定的点开始快照您的管道,例如从数据集C开始并包括数据集,您只需选择C的快照数据集(在本例中为CSnapshotDataset(并构建它。管道的下一次(计划的(运行将快照C及其下游的所有内容。

要定期运行此操作,可以设置一个时间表来构建CSnapshotDataset

我慷慨地应用了这个包装器(通常用于我编写的任何转换(,这使我能够灵活地从任何可能需要它的数据集中快照管道

虽然设置这个需要更多的前期工作,但它的主要优势是:

  • 只需单击一次即可启动快照,再单击几次即可设置计划的快照,而不必执行多个curl调用
  • 它保持输入和输出数据集的事务历史记录的清洁
  • 它完全在平台中发生,不需要使用命令行、jenkins或类似命令提取令牌

我认为您只需在运行时决定是在replace还是modify的输出中使用TransformOutput.set_mode()。通过这种方式,您可以根据输入的大小来决定是否要覆盖或附加到输出

我想你可以

输入:

input = input.dataframe('current') 

输出:

output.set_mode('replace')

最新更新