捕获in文件中的新数据并写入Bigquery



我是GCP的新手,需要帮助来为这个场景设置系统。

GCS中有一个文件,它由应用程序(例如log)编写。我需要捕获在这个文件中写入的每一条新记录,然后通过在数据中写入一些转换逻辑来处理记录,最后将其写入一个bigquery表。

我正在考虑这个方法:

  1. 事件触发Google存储文件
  2. 写入pub/sub
  3. 应用google云功能
  4. 订阅bigquery

我不确定这种方法对于这个用例是否是最佳的和正确的。请建议。

这取决于您的需求。以下是一些选项:

1

像这样简单地挂载这个文件作为外部表是否合适?

这些文档中的一个例子:

CREATE OR REPLACE EXTERNAL TABLE mydataset.sales (
Region STRING,
Quarter STRING,
Total_Sales INT64
) OPTIONS (
format = 'CSV',
uris = ['gs://mybucket/sales.csv'],
skip_leading_rows = 1);

如果你想要的转换可以用SQL来表达,这就足够了:你可以定义一个执行转换的SQL视图,但是它总是查询最新版本的数据。然而,在这种设置下,查询可能会变得有点慢。

2

你的BigQuery表必须是最新的吗?通常不需要实时准确性,在这种情况下,调度上的批处理负载作业可能是最合适的。对于这种方法,有一个很好的内置系统,BigQuery数据传输服务,您可以使用它每隔15分钟同步一次BigQuery表。

与外部表不同,您可以为您的转换创建一个物化的视图,确保良好的性能,并保证在最常规的调度情况下,数据不会超过15分钟。

3

好的,您需要实时可用性良好的性能/您的转换太复杂而无法用SQL表达?对于这一点,您的建议看起来不错,但它有相当多的活动部分,并且肯定会有一些系统中的延迟。在这种情况下,您最好遵循GCP使用Dataflow服务的首选路线。这里的链接是他们提供的模板,用于将文件从GCS流式传输到BigQuery,并通过函数应用您选择的转换。

4

还有另一种情况我没有处理,这是你需要实时数据,但转换是复杂的,不能用SQL表示。在这种情况下,我可能会建议一个批处理作业在一个简单的时间表上运行(使用你选择的语言的GCS客户端库和BigQuery客户端库)。

有很多很多方法可以做到这一点,除非你在一个完全未开发的项目中工作,你几乎肯定有一个你可以使用的方法。但我要指出的是,GCP最近创建了使用云调度程序执行云运行作业的功能,如果您还没有这样做的方法,这可能是最简单的。

这并不是说您的方法不起作用——您绝对可以根据GCP桶中的更改直接触发云函数,因此您可以编写一个函数来每次执行ELT过程。这不是一个糟糕的全面方法,但我的目的是给您一些示例,这些示例要么更简单,要么性能更高,涵盖各种可能的需求。

最新更新