我正在用Python运行一个管道,在那里我刮了很多数据,想要在外部数据库(Digital Ocean Postgres)中加载,我有一些选项,但它们在性能上都不好看(或者我不能正确评估性能):
- 使用
from beam_nuggets.io import relational_db
有一些性能上的缺点,因为它逐行加载; - 上传分组数据到
pubsub
,在那里我可以运行一些云功能上传到外部数据库,然而,即使是探索这可能是云功能运行的大数据,并且在消息数量和消息大小方面有一些限制,我可以发布; - 上传到
bucket
,在那里我可以运行云功能,但这样我就会面临同样的问题,关于一个函数处理和分裂的大量数据将是很多函数调用;
对我来说,如果我能在一个插入中上传一堆数据,那就太好了(我认为),像COPY TO
这样的东西,但我不能在DataFlow上运行这个。
任何想法?
提交数据流管道后,数据流服务启动几个worker(即VM)来执行您的管道。每个worker将被分配一定的键范围用于并行执行,并在必要时将数据shuffle到另一个worker(即GroupByKey)。因此,一般来说,如果你有较大的键数和较小的键值大小,你的管道有更好的性能。
在"一个大数据用于一个函数运行"的情况下,如果您的数据与许多键相关联,并且为这些键运行相同的函数,那么这可能是好的。但是,如果您指的是在函数中运行的一个键的大数据(例如,DoFn),那么它可能会遇到性能问题,因为它可能会减慢键并行性,并且您可能会遇到一些系统限制(https://cloud.google.com/dataflow/quotas)。例如,单个元素有大小限制。
关于后一种情况的一些想法:你可以考虑将你的(单个大)数据分割成许多块,并分配给不同的键(例如,使用公共前缀)。在数据库查询层,可以根据前缀进行查询。或者,如果你的数据库支持键值附加,你可以在一个键中批量读取(单个大)数据,并将结果附加到数据库中。
我认为一个好的起点是检查谷歌提供的模板(https://cloud.google.com/dataflow/docs/guides/templates/provided-templates),在那里你可以找到从GCS读取数据并将处理后的数据插入到BigQuery的例子。你也可以做类似的事情。