忽略/跳过不存在的GCS输入文件

时间:2015-05-15 09:18:23

标签: google-cloud-dataflow

我们的要求是处理Google DFP广告管理系统直接写入我们的GCS广告资源的最近24小时广告日志。

我们目前通过使用Flatten并在过去24小时内传入所有文件名来实现此目的。文件名采用yyyyMMdd_hh格式。

但是,我们发现有时DFP广告管理系统有时无法写入文件。我们已经向DFP员工提出了这个问题。

但是,有没有办法配置我们的数据流作业以忽略任何丢失的GCS文件,并且在这种情况下不会失败?如果一个或多个文件不存在,它当前会失败。

2 个答案:

答案 0 :(得分:1)

使用TextIO.ReadAvroIO.Read等数据流API从不存在的文件中读取,当然会抛出错误并导致管道失败。这是按预期工作的,我想不出解决方法。

现在,从像yyyyMMdd_*这样的文件模式中读取可能会解决您的问题,至少部分是这样。 Dataflow会将filepattern扩展为一组文件并对其进行处理。只要存在至少一个与提供的模式匹配的文件,管道就应该继续。

每个文件拥有一个源的方法通常是反模式 - 效率较低且不太优雅,但功能相同。不过,您仍然可以在构建Dataflow管道之前使用Google Cloud Storage API修复此问题,以确认每个文件的存在。如果输入文件不存在,您只需跳过生成其中一个源。

无论哪种方式,请记住GCS list API提供的最终一致性保证。这意味着扩展文件模式可能不会立即生成否则可读的所有文件。然而,对于这种情况,反模式可能是一个很好的解决方法。

答案 1 :(得分:-1)

也许不是最佳答案,但您可以随时使用

GcsUtilFactory.create(options).expand(...)

获取存在的所有文件。然后你可以相应地创建Flatten。

等待更专业的答案。