Streaming 谷歌云数据流:在PubSub流模式下,TextIO.Read使用了大量的vCPU时间

Streaming 谷歌云数据流:在PubSub流模式下,TextIO.Read使用了大量的vCPU时间,streaming,google-cloud-platform,google-cloud-dataflow,google-cloud-pubsub,Streaming,Google Cloud Platform,Google Cloud Dataflow,Google Cloud Pubsub,我正在使用谷歌云平台将数据从Azure服务器传输到BigQuery表,从功能上讲,该表运行良好且平稳。 管道如下所示: 管道的“FetchMetadata”部分是一个简单的TextIO.Read实现,其中我从GCP存储桶中读取了一个66行的.csv文件,其中包含元数据: PCollection<String> metaLine = p.apply(TextIO.Read.named("FetchMetadata") .from("gs://my-bucket

我正在使用谷歌云平台将数据从Azure服务器传输到BigQuery表,从功能上讲,该表运行良好且平稳。 管道如下所示:

管道的“FetchMetadata”部分是一个简单的TextIO.Read实现,其中我从GCP存储桶中读取了一个66行的.csv文件,其中包含元数据:

PCollection<String> metaLine = p.apply(TextIO.Read.named("FetchMetadata")
            .from("gs://my-bucket"));
当我在批处理模式下使用管道时,这就像一个魅力:首先元数据文件在不到一秒钟的vCPU时间内加载到管道中,然后数据本身加载到管道中。现在,当以流模式运行时,我希望在某种程度上复制这种行为,但当我只使用相同的代码时,存在一个问题:当管道仅运行15分钟实际时间时,TextIO.Read块使用了惊人的4小时vCPU时间。对于将为低预算项目永久运行的管道,这是不可接受的

所以我的问题是:如果文件发生更改,是否有可能更改代码以便定期再次读取文件?我希望管道得到更新,所以让我们假设每小时更新一次,而不是像现在这样连续更新


我发现一些文档中提到了TextIO.Read.Bound,这看起来是解决这个问题的好地方,但据我所知,它并不能解决我的定期更新问题。我遇到了类似的情况。我解决这个问题的方法有点不同。我希望社区能够深入了解这个解决方案

我在一个GCS存储桶中每小时都会更新一次文件。我在博客上写了一篇关于

我将appengine端点配置为从包含要处理的文件的GCS bucket接收对象更改通知。对于创建的每个文件,更新也是对象存储中的创建操作,应用程序引擎应用程序将向google数据流提交作业。作业将从HTTP请求主体中的文件名中读取行,并将其发布到Google PubSub主题

然后,一条流媒体管道被订阅到GooglePubSub主题,该主题将处理相关行并将其输出到BigQuery。通过这种方式,流媒体管道在空闲时以最少的工作人员计数运行,文件的接收通过批处理管道进行,流媒体管道根据Google PubSub主题中的发布量进行缩放

在向Google数据流提交作业的教程中,jar在底层终端上执行。我修改了代码,使用可以使用参数执行的模板向google数据流提交作业。通过这种方式,作业提交操作变得超轻,同时仍然为每个上传到GCS存储桶的新文件创建作业。有关执行google数据流作业模板的详细信息,请参阅链接


注意:如果需要修改dataflow作业模板和app engine应用程序的代码段的答案,请在注释中提及,我将相应地更新答案

看起来是解决我问题的好办法!我希望有一个更简单的解决方案。。。我开始使用流式管道,因为我想消除将文件推送到GCS,然后将其批处理到BQ的不必要性,因为从开发人员的角度来看,这将使整个设置简单得多。。。